Hallo zusammen, ich habe versucht einem ATmega162 das UART-Protokoll beizubringen. Allerdings geht da rein gar nichts. Es ist alles ein bisschen chaotisch. Ich benutze ein STK500. Einen externen Quarz mit 3686400 Hz. Jumper sind richtig gesetzt, AVR sitzt in Slot 3000D3. ISP Programmierung. Fuses: Divide clock by 8 ist deaktiviert Int. RC 0sc.; Start-up time: 6CK + 65ms; [CKSEL=0010 SUT=10] Und das ist komisch: ich benutze ja einen externen Quarz, aber wenn ich das entsprechende Fuse setzen möchte, schmiert mir das Teil komplett ab und ich kann gar nichts mehr setzen. So habe ich jetzt schon meinen dritten AVR am Start. :-( Ich habe ein einfaches Testprogramm geschrieben, welches mir Zeichen auf TX an den PC senden soll (empfange mit HyperTerminal) und gleichzeitig über Port B die LEDs ansteuern soll zur Kontrolle. So habe ich herausgefunden, dass das Programm in der Routine USART_Transmit hängen bleibt. Aber wieso????? Bitte helft mir, ich bin kurz davor zu verzweifeln. ;-) Schonmal danke für die Hilfe. Gruss Martin .include "m162def.inc" .def count1 = r16 ; .def akku = r17 ; .def count2 = r18 ; .def count3 = r19 ; ldi akku, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, akku ldi akku, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, akku ldi akku, $ff ; out DDRB, akku ; main: ; andi akku,1 out PORTB,akku rcall USART_Transmit rjmp main USART_Init: ;set baud rate ldi r17,0 ldi r16, 23 out UBRR0H, r17 out UBRR0L, r16 ;Enable receiver and transmitter ldi r16, (1<<RXEN0) | (1<<TXEN0) out UCSR0B,r16 ;set frame format: 8data, 1stop bit ldi r16, (1<<URSEL) | (0<<USBS0) | (3<<UCSZ00) out UCSR0C,r16 ret USART_Receive: sbis UCSR0A, RXC0 rjmp USART_Receive in akku, UDR0 out PORTB, akku ret USART_Transmit: sbis UCSR0A,UDRE0 rjmp USART_Transmit out UDR0,akku ret
P.S: den Aufruf rcall USART_Init habe ich versehentlich gelöscht, der taucht natürlich auf...
>So habe ich jetzt schon meinen dritten AVR am Start. :-( Hast du die Dinger per HW-Parallel-Programming-mode versucht zu "reaninmieren"? >(0<<USBS0) multiosenseful... um ein Bit zu löschen muß es "... &= ~(1<<USB0)" heissen...
nein, habe noch nicht versucht sie zu reanimieren. Solange ich noch welche übrig habe, versuche ich erstmal das Programm zum laufen zu bringen. USBS0 stimmt meiner Meinung nach schon: 0 == 1 Stop Bit. (ich habe gerade nochmals im Datenblatt nachgeschaut)
ich meinte auch nicht USBS0, sondern das ganze Konstrukt "(0<<USBS0)". Du versuchst eine 0 zu verschieben, und sie dann noch mit Einsen zu verodern. Da kannst du dir das Ding "(0<<USBS0)" gleich sparen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.