Forum: Mikrocontroller und Digitale Elektronik ATmega128 + USART


von Jan (Gast)


Lesenswert?

Hi :)

also ich bekomme einfach keine USART-Kommunikation mit meinem ATmega128 
hin. Die Mega103 Kompatibilität ist ausgeschaltet, und ich will USART0 
nutzen. Da an den selben Leitungen der ISP-Anschluss hängt, habe ich zu 
RX und TX welche vom MAX232 kommen, jeweils einen 10k Widerstand 
eingebaut (hoffe das ist richtig so?).

Der ISP-Zugriff klappt prima, nur beim RS232 tut sich gar nicht. Die 
Baudrate hab ich auf 2400 gestellt, weil ich bislang nur den internen 
Oszi genutzt hab (hab beim fusen auf den externen den µC schon zweimal 
"abgeschossen" und musste ihn über nen externen Takt wiederbeleben, also 
bin ich da nun bissel... ängstlich :)).

Den ATmega128 hab ich auf einer Mini-Aufsteck-Platine gekauft, laut 
Händler ist ein "PBRC16.00MHz Resonator" verbaut. Bei den Fuses im AVR 
Studio hab ich zuerst dafür CKOPT gesetzt (laut Datenblatt für 
Frequenzen über 8MHz nötig) und External Crystall/Resonator High 
Frequenz, Startup-Time: 16K CK + 64ms gewählt... zack ging nichts mehr 
:) Dann hab ich noch den Ext. RC-Osc. 8MHz-12MHz Startup-time 6CK + 4ms 
geklickt, und wieder tot.

Im Momemnt läuft der µC mit der Einstellung "Int. RC-Osc. 4MHz 
Startup-time 6CK + 4ms" ...

Für das Testen der UART-Verbindung hab ich folgendes Programm 
geschrieben:
-----

.INCLUDE "m128def.inc"
.DEF temp = R16

.EQU Baud = 2400
.EQU CLOCK = 4000000
.EQU UBRVAL = CLOCK/(Baud*16)-1

  ; Stackpointer initialisieren

  ldi temp,LOW(RAMEND)    ; Unteres Ende des Stackspeichers
  out SPL,temp
  ldi temp,HIGH(RAMEND)   ; Oberes Ende des Stackspeichers
  out SPH,temp

  ; Baudrate einstellen
  ldi temp,LOW(UBRVAL)
  out UBRR0L,temp
  ldi temp,HIGH(UBRVAL)
  sts UBRR0H,temp

  ; Frame Format 8bit
  ldi temp, 0x00 ; R16 wird mir Nullen belegt
  out UCSR0A, temp ; Control and Status Register A (UCSRA) wird mit 
Nullen
          ; belegt
  out UCSR0B, temp
  ldi temp,0b00010011
                    ; = Asynchroner Modus, kein Parity Bit
                  ; 1 Stop Bit, 8 DatenBits
  sts UCSR0C,temp          ; temp wird in UCSRC geschrieben


start:
cbi UCSR0B,TxEN0   ; Transmit Enable auf 0 gesetzt
sbi UCSR0B,RxEN0   ; Receive Enable wird auf 1 gesetzt

empfangen:
      sbis UCSR0A,UDRE0    ; Skip Bit if Set = Überspringe die nächste 
Anweisuung
                     ; wenn Bit UDRE des Registers UCSRA auf 1 gesetzt 
ist
                   ; UDR=1 heißt, dass UDR (Buffer) leer ist
      rjmp empfangen       ; wenn UDR nicht leer ist, zurück zu 
"empfangen"

komplett:
sbis UCSR0A,RxC0                 ; sbis, wenn die Daten komplett 
empfangen wurden
rjmp komplett

in temp,UDR0  ; empfangenes Byte aus dem Buffer UDR nach R16 schieben
inc temp     ; R16 um 1 inkrementieren

leer:
sbis UCSR0A,UDRE0
rjmp leer

out  UDR0,temp

cbi UCSR0B,RxEN0  ; Receive Enable wird auf 0 gesetzt
sbi UCSR0B,TxEN0  ; Transmit Enable wird auf 1 gesetzt

test:
sbis UCSR0A, UDRE0 ; sbis wenn UDR Empty
rjmp test

a2:
sbis UCSR0A,TxC0 ; Tranmission Complete?
rjmp a2
sbi UCSR0A,TxC0  ; manuelles Löschen von TxC durch auf 1 setzen
rjmp start
------------

Das Ding funktioniert (mit umgewandelten Registern) auch auf einem 
ATmega8.

Der einzige technische Unterschied ist, dass ich beim ATmega128 einen 
USB-Seriell-Wandler benutzen muss (der mega8 ist aufm Asuro, da läuft 
das über einen IR-USB-Transmitter)... könnte das vl auch an dem Teil 
liegen? Oder hats mit der Taktquelle zu tun? Ich hätte gedacht, dass 
dann vl fehlerhafte Zeichen kommen, aber im Hyperterminal kann ich 
nichtmal was eintippen (und es kommt freilich auch nichts :)) ....

Wäre super wenn mir jemand auf die Sprünge helfen könnte!
Vielen Dank und liebe Grüße,
Jan

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Die 10kOhm soltest du besser wieder ausbauen, die Max232 haben interne 
Pulldownwiderstände. Da wird wesentlich mehr Strom benötigt um 
durchzuschalten, als über einen 10k kommen kann.

Bau besser Jumper ein um den Max abzutrennen oder verzichte auf den ISP 
(Bootloader verwenden).

Grüße,

Peter

von Johannes M. (johnny-m)


Lesenswert?

UART mit dem internen Oszillator ist reines Glücksspiel! Das geht nur 
mit einem Quarz wirklich zuverlässig.

von Jan (Gast)


Lesenswert?

ah ok danke soweit!

kann mir denn jemand sagen, welche einstellung ich für den ext. takt 
wählen muss? ... wie gesagt, die bezeichnung bringt mich irgendwie 
durcheinander... :/

danke!

von Johannes M. (johnny-m)


Lesenswert?

Jan wrote:
> kann mir denn jemand sagen, welche einstellung ich für den ext. takt
> wählen muss?
Als allererstes musst Du entscheiden, ob Du tatsächlich einen externen 
Takt (external clock) hast oder einen Quarz (external crystal). Das 
sind nämlich zwei völlig unterschiedliche Dinge.

> ... wie gesagt, die bezeichnung bringt mich irgendwie
> durcheinander... :/
Welche Bezeichnung?

AVR Fuses

von Jan (Gast)


Lesenswert?

dieses ding hier soll der externe taktgeber sein: PBRC16.00MHz Resonator 
... nur das sieht ja für mich nach einem rc-oszi aus? ... und der µC ist 
bei der einstellung ja bereits abgeschmiert bei mir.. ?

danke weiterhin!

von spes53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>dieses ding hier soll der externe taktgeber sein: PBRC16.00MHz Resonator
>... nur das sieht ja für mich nach einem rc-oszi aus? ... und der µC ist
>bei der einstellung ja bereits abgeschmiert bei mir.. ?

Schon mal Datenblatt angesehen?

MfG Spess

von Jan (Gast)


Lesenswert?

ah um ehrlich zu sein - nein *g ... entschuldigung. (und danke :))
also das sieht für mich nach einem quarz, sprich external crystal aus. 
nur wieso ging dann die einstellung External Crystall/Resonator High
Frequenz, Startup-Time: 16K CK + 64ms plus gesetzte CKOPT fuse nicht? 
... also nachdem ich das so eingestellt und die fuses geschrieben hab, 
konnte ich nichtmehr auf den µC zugreifen? ...

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.