wie bekomm ich den raus ob der wirklich auf 16000000 läuft ? oder ob mein quarz nicht funktioniert (falsh angeschlossen ist )
Hi,
ich hab das unten angehangene Program auf meinen ATMega32 gefalshed ich bekomme allerdings egal welches zeichen ich sende immer das gleiche zurück (À).
SYSCLK und BAUD sind natürlich angepasst
Code:#include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define SYSCLK 7372800 #define BAUD 38400UL #define UBRR_BAUD ((SYSCLK/(16*BAUD))-1) /* USART initialisieren */ void uart_init(void); void init(void); int main(void) { /* USART initialisieren */ uart_init(); sei(); /* Nichts tun. Die Interrupts erledigten den Rest */ while (1) ; } void uart_init(void) { /* Baudrate einstellen ( Normaler Modus ) */ UBRRH = (unsigned char) (UBRR_BAUD>>8); UBRRL = (unsigned char) UBRR_BAUD; /* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */ UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); /* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */ UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); } /* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */ SIGNAL(SIG_UART_RECV) { unsigned char buffer; /* Daten aus dem Puffer lesen ... */ buffer = UDR; /* ... warten bis der Sendepuffer leer ist ... */ while ( !( UCSRA & (1<<UDRE)) ) ; /* ... und gleich wieder zurück schicken */ UDR = buffer; } void init(void) { DDRB = 0xff; // PortB als Ausgang deklarieren PORTB = 0x00; // Ports auf LOW schalten }
wie bekomm ich den raus ob der wirklich auf 16000000 läuft ? oder ob mein quarz nicht funktioniert (falsh angeschlossen ist )
mh funktioniert.. lag wohl an meinem monitor program ... nen program um den real takt anzuzeigen wäre aber schon cool ( =
Ist zwar nur ne grobe Hausnummer, aber lass doch eine LED im Sekundentakt blinken. 10 Zyklen stoppen und dann kannst Du abschätzen wie Dein tatsächlicher Takt ist.
mh ich war wohl was voreilig ich bekomme zwar unterschiedliche zeichen zurück aber keine buchstaben die ich eigentlich auch sende ...
if (buffer == "a") /* Falls Taster an PIN PB0 gedrueckt.. */
PORTD = ( 1 << PD7 );
würde das mit der if bedinung so funktionieren ?
zu der led würde die nicht 10 mal jede sekunde blinken egal welcher takt eingestellt ist ? da der timer ja aus der taktrate berechnet wird ?
es muss heissen:
Code:if (buffer == 'a') { PORTD = (1<<PD7); }
weil buffer ja vom typ unsigned char ist.
Den LED Takt im Code berechnest Du, z.B. aus SysCLK = 8000000.
Wenn jetzt stattdessen die tatsächlice Taktrate des Chips nur 1MHz ist, blinkt die LED 8 mal langsamer.
mh super danke jetz geht es ... mein atmega läuft nur auf 1000000 troz 16mhz quarz ... jemand da ne idee ?
hmm hast du die Fuse Bits richtig gesetzt ?
Musst du zuerst auf externen Quarz umschalten.
mfg
also die zeichen kommen jetz richtig zurück bis auf einige wenige male ... wie werden die denn im buffer gespeichert als ASCII ? das ich die so wie oben geschrieben abfragen kann ?
da die if bedingung nciht funktioniert ) =
habs mal mit buffer =! a probiert ... dies funktioniert ... da auch das a zurück kommt denke ich mal das es nicht im ASCII format gespeichert wird
sch**** ich wusste ich hatte was vergessen mach ich gleich mal bubi vieln dank
Lesezeichen