Forum: Mikrocontroller und Digitale Elektronik ATmega162 RX-TX-Testprogramm geht nicht/ Probleme mit STK500


von Martin Vojtek (Gast)


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

von Martin Vojtek (Gast)


Lesenswert?

P.S: den Aufruf rcall USART_Init habe ich versehentlich gelöscht, der
taucht natürlich auf...

von Rahul (Gast)


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...

von Martin Vojtek (Gast)


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)

von Rahul (Gast)


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.

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
Noch kein Account? Hier anmelden.