ATmega162 RX-TX-Testprogramm geht nicht/ Probleme mit STK500

Gast #322837
Lesenswert?
• ▲
▼
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
Gast #322839
Lesenswert?
• ▲
▼
>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...
Gast #322840
Lesenswert?
• ▲
▼
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)
Gast #322841
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.