ATMEGA32A UART Problem

OP #1820184
Lesenswert?

Hallo,

wieder muss ich das Forum bemühen, um eine Klärung meines Problems zu 
bekommen. Ich betreibe mein ATMEGA32A mit 1MHz internen Oszillator. 
Leider bekomme ich in Minicom kein Zeichen. Obwohl im regelmässigen 
Abstand auf der TXD Leitung ein kurzzeitiges Signal erscheint. Ich habe 
leider keinen Oszi, um nähere Hardwareuntersuchungen anzustellen. Sieht 
jemand in meinem Quellcode einen Fehler?

MfG

hue \a
Angehängte Dateien:
Gast #1820194
Lesenswert?

Hi

>Ich betreibe mein ATMEGA32A mit 1MHz internen Oszillator.

Schlecht. Der interne Oszillator ist für serielle Kommunikation nicht 
sonderlich geeignet. Nimm einen (Baudraten-) Quarz.

>usart_transmit:
...
>reti

Unterprogramme werden mit 'ret' abgeschlossen.

MfG Spess
OP #1820204
Lesenswert?

Hallo,

am Abschluss einer ISR sollte es nicht liegen, da ich an einer LED PORTA 
Bit0 sehe, dass die ISR funktioniert. Leider bekomme ich das Zeichen 'U' 
nicht in den Rechner. Ich benutze einen USB-Seriell Adapter um die Daten 
zu empfangen.

Hat noch jemand eine Idee?

MfG

hue \a
Gast #1820235
Lesenswert?

>Auch die Reduzierung auf 2400 Baud mit
>einem relativen Fehler von 0.2% bringt mir die Lösung nicht.

0.2% Fehler hat die Baudrate wenn der Takt 0% Fehler hat.
Wenn der Takt 3% Fehler hat kannst du die 0.2% Fehler
vernachlässigen.
OP #1821260
Lesenswert?

Hallo,

ich komme noch immer nicht weiter, und habe noch folgendes Problem, dass 
die LED am PORTA,0 mit einer Blinkdauer von 4.16sec doppelt so schnell 
blinkt, als im Timer1 eingestellt. Also bei einem Interrupt bei 16MHz 
und Overflow bei 0xFFFF müsste laut Formel die Blinkdauer 8.38sec 
betragen. Das Blinken wird doch nur angesprungen, wenn 8.38sec rum sind?

Wenn meine Betrachtung so richtig sind, dann kann auch mit der Taktung 
des UART nichts stimmen.

Kann mir jemand helfen?

MfG

HUE \a
#1821595
Lesenswert?

Hue \a schrieb:

> die LED am PORTA,0 mit einer Blinkdauer von 4.16sec doppelt so schnell
> blinkt, als im Timer1 eingestellt. Also bei einem Interrupt bei 16MHz
> und Overflow bei 0xFFFF müsste laut Formel die Blinkdauer 8.38sec
> betragen.

Du sollst keine Formeln anwenden, die du nicht verstehst. Statt dessen 
sollst du dir klarmachen, wie ein Timer funktioniert, dann brauchst du 
die Formel nicht.

Wenn deiné LED 4.19 Sekunden an ist und dann 4.19 Sekunden aus, dann 
läuft dein Prozessor nicht mit 16 Mhz sondern mit 1Mhz, denn

1000000/64/65536 = 0.238

Kehrwert davon sind 4.19 Sekunden.

Alle 4.19 Sekunden wird daher die ISR angesprungen, in der du die LED 
umschaltest.

Würde dein Prozessor mit 16 Mhz arbeiten, dann würde die ISR alle 0.26 
Sekunden angesprungen und damit die LED umgeschaltet werden.
Gast #1821612
Lesenswert?

"USB-Seriell Adapter"

Ja. Lass des ma bleiben. Die Dinger buggen manchmal. Hatte letztens das 
gleiche Problem. Pc mit serieller Schnittstelle: fehlerfrei. Laptop mit 
Adapter: keine Funktion. Anderer Laptop mit gleichem Adapter und 
gleichen Einstellungen: fehlerfrei.
OP #1821619
Lesenswert?

Hallo,

ich habe bei meinen Betrachtungen einen Fehler festgestellt, die hier 
wieder zur Verwirrung beigetragen haben. Ich takte richtig mit 16MHz 
nebst passenden Fusebits. Meine Berechnungen sind insofern richtig, da 
sie die Umschaltfrequenz von TOV berechnen, also einmal an und einmal 
aus. Dies ergibt eine Laufzeit von 8.38sec. Also 16MHz/(2*1024*65536) 
und dann invertiert.

Daraus schlussfolgere ich, das mein System korrekt arbeitet.

Nun habe ich aber immer noch das Problem des Datenaustausches per UART.
Ich benutzte einen USB-Seriell-Adapter und bekomme mit den eingestellten 
Datenübertragungsraten und minicom keinen Verkehr zustande.

Hat jemand noch einen Tipp?

MfG

HUE \a
Gast #1821626
Lesenswert?

bla schrieb:
> USB-Seriell Adapter"
>
> Ja. Lass des ma bleiben. Die Dinger buggen manchmal. Hatte letztens das
> gleiche Problem. Pc mit serieller Schnittstelle: fehlerfrei. Laptop mit
> Adapter: keine Funktion. Anderer Laptop mit gleichem Adapter und
> gleichen Einstellungen: fehlerfrei.

sorry wegem Doppelposten
#1821631
Lesenswert?

Hue \a schrieb:

> Also 16MHz/(2*1024*65536)

                ****

Sicher?
In deinem zuerst geposteten Programm hast du nämlich einen Vorteiler von 
64 und nicht 1024.
1
      ldi    r16,(1<<CS10|1<<CS11)
2
      out    TCCR1B,r16

1024 / 64  ergibt aber wieder einen Faktor 16
Arbeitet dein System mit 1 Mhz, hast du einen Vorteiler von 64 
programmiert und mit 1024 gerechnet, kommen falsche Zeiten raus, die dir 
duch den Fehlerfaktor 16 vorgaukeln, dass dein System mit 16 Mhz 
arbeiten würde.
OP #1821813
Lesenswert?

Hallo,

ich habe den Vorteiler auf 1024 geändert, da ich sicherstellen wollte, 
dass alle Datenpakete in der Zeit von 4.19sec bei beliebiger Baudrate 
ankommen.

Ich hatte dies vergessen zu dokumentieren.
Ich habe weiterhin das Kommunikationsproblem, habe auch nun einen 
Rechner besorgt, mit richtiger RS232 Schnittstelle, also ohne USB 
Adapter: kein Signal vom AVR.

Wenn mich jemand sucht, ich bin im Badezimmer... auf dem Fussboden ... 
und heule.

MfG

HUE \a
OP #1821859
Lesenswert?

Hallo,

ja ich habe einen Schnittstellenwandler eingebaut. Es liegen am TxD 
Ausgang auch Pegel an, welche nach 4.19sec (die LED wechselt den 
Zustand) sich ändern und wieder in Ausgangspegel gehen. Der Pegel liegt 
bei -8.8V und wird nach 4.19sec positiv für kurze Zeit, ich habe leider 
keinen Oszi.

Das Setzen des Richtungsregisters auf Ausgang am TxD ist nun 
folgendermaßen:

ldi r16,0x02
out DDRD,r16

Leider ohne Erfolg... bin wieder im Bad...


MfG

HUE \a
#1821868
Lesenswert?

Hue \a schrieb:
> Hallo,
>
> ja ich habe einen Schnittstellenwandler eingebaut. Es liegen am TxD
> Ausgang auch Pegel an, welche nach 4.19sec (die LED wechselt den
> Zustand) sich ändern und wieder in Ausgangspegel gehen. Der Pegel liegt
> bei -8.8V und wird nach 4.19sec positiv für kurze Zeit, ich habe leider
> keinen Oszi.

Das sieht eigentlich gut aus.

Was ist mit dem Seriell-Kabel?
Hast du das schon durchgemessen bzw. den Loopback-Test gemacht?
Gast #1821871
Lesenswert?

Zeigt doch mal den aktuellen Quellcode (vollständig) nebst Fuses(!). 
Falls es an dem nicht liegt kanns immernoch ein Hardwareproblem sein. Da 
man letzteres übers Netz schwer beurteilen kann stollten wir mit 
ersterem beginnen.
#1821885
Lesenswert?

Hue \a schrieb:
> Hallo,
>
> das Kabel ist ein Nullmodem- Kabel und die Ader RxD und TxD sind
> messtechnisch geprüft. Ich kann am Ende ja auch den Wechsel des Pegels
> am Pin 2 messen.

OK.
Dann Loppback Test:
µC aus dem Sockel rausnehmen, TxD mit RxD im Sockel mit einer 
Kabelbrücke verbinden. Am Terminalprogramm auf der Tastatur klimpern. 
Was du klimperst muss angezeigt werden.
Gegentest: Brücke rausnehmen, das Echo muss aufhören.

Wenn das funktioniert, dann ist die Hardware in Ordnung.
OP #1821918
Lesenswert?

Ich bin es nochmal,

da ich mit Minicom die Verbinung über einen USB Adapter hergestellt 
habe, muss doch dann die Fehler in meinem Programm liegen. Kann jemand 
das unabhängig noch einmal ansehen. Es müsste mit 9600 Baud 8,n,1 
eingestellt sein, sonst hätte Minicom ja gemeckert.

Für Eure zahlreichen Hinweise bin ich schon jetzt recht froh, ich habe 
wieder viel gelernt. Man lernt ja nie aus....


MfG

HUE \a

PS: Hier noch das Makefile mit den Fuses.
OP #1822696
Lesenswert?

Hallo nochmals,

es scheinen mehrere Bytes anzukommen, ich habe mit einem 
selbstgeschriebenen Programm auf dem PC immer mehrere Bytes auslesen 
können, obwohl ich im Assembler nur ein 'U' sende. Das 'U' kommt aber 
nicht an. Es kommen nur 0x00 an.

Hat jemand noch einen Tipp?

MfG

HUE \a
#1822708
Lesenswert?

Hue \a schrieb:

> Hat jemand noch einen Tipp?

Immer derselbe.
Bei diesen Symptomen ist es zu 99% so, dass der µC mit einer anderen 
Taktrate arbeitet als du denkst.

Ich bin jetzt aber ehrlich gesagt zu faul ein Assembler-Testprogramm zu 
schreiben. In C würdest du eines auf der weiter oben schon verlinkten 
Troubleshooting Seite finden.

> es scheinen mehrere Bytes anzukommen, ich habe mit einem
> selbstgeschriebenen Programm auf dem PC immer mehrere Bytes auslesen
> können

Für die ersten Tests würde ich kein selbstgeschriebenes Programm 
verwenden. Stichwort: Mehrfrontenkrieg. Du weißt dann nie ob das Problem 
beim Sender oder beim Empfänger liegt. Auf PC-Seite würde ich zuerst auf 
eine bewährte, nachweislich funktionierende Lösung wie zb HTerm setzen.
Gast #1822766
Lesenswert?

..mehrere Bytes statt nur einem? Das könnte an einer falschen Baudrate 
liegen. Oder an was anderem :-)

Hack doch mal ein kleines Bruteforcetestprogramm zusammen, etwa so wie 
folgt (in Pseudocode):
1
main()
2
{
3
    char pTemp[11];
4

5
    // enable tx
6
    UCSRB = (1 << TXEN);
7

8
    for (uint16_t ubrr = 0; ubrr < 1024; ubrr++)
9
    {
10
        UBRRH = ubrr >> 8;
11
        UBRRL = ubrr & 0xFF;
12

13
        sprintf(pTemp, "..%d..\n", ubrr);
14

15
        uart_send_string(pTemp);
16
        _delay_ms(200);
17
    }
18

19
    while (1)
20
        STATUS_LED_TOGGLE();
21
}

Dessen Ausführung sollte man abwarten können (gut 200 Sekunden 
Verwartezeit sofern F_CPU halbwegs passt, zzgl. Übertragungszeiten, das 
ist abwartbar), und irgendwann(tm) sollte dann auch was sinnvolles(tm) 
im Terminal ankommen.

Wenn gar nie nicht nix sinnvolles kommt-> Nochwoanderseinbug. Wenn was 
sinnvolles kommt (hier: ein funktionierender Wert für UBRR), dann kann 
man auf F_CPU und co zurückschließen.

Hierzuworkstation sieht der Anfang der Ausgabe übrigens so aus:
1
�����!�h�I�I�I�I�)��ד���u�ץj���Jխ��J�Zū����W�jVT�%–I��IʖI�..22..�..23..
2
..24..
3
..25..
4
..26..
5
..27..
6
..28..
7
.N29..
8
^^3`^^
9
^^sa^^
10
��cļ����t����DŽ�����T������G�����G�<�#��##|�BŒcc|�B�

..wobei rein rechnerisch die 25 korrekt ist (16MHz, 38400).

Also, viel Spaß!
OP #1823045
Lesenswert?

Hallo liebe Forumsleser,

dies wird meine letzte Anfrage bezüglich meines Problems sein, ich habe 
das Thema zu lange strapaziert, ich hätte nur noch eine Bitte, mein 
gepostetes Datenfile einmal zu untersuchen.

Ich habe die Daten vom ATmega32 empfangen, welchen ich wie im Quellcode 
beschrieben auf 9600Baud, 8 Bit, keine Parität, ein Stopbit eingestellt 
habe.

Dann habe ich auf meinem Rechner ein Programm geschieben, welches die 
Datenrate von 1 bis fast unendlich laufen lies, und die Ergebnisse des 
Empfangs in die Datei data.dat geschieben habe.

Der Aufbau der Datei ist pro Zeile folgendermaßen:

Baudrate Data: 'empfangene Daten' End

Ich werde aus den empfangenden Daten nicht schlau, es sind verschiedene 
Zeichen, meistens mehrere Bytes.

Bitte helft mir ein letztes Mal, ich weiss mir keinen Rat mehr.

MfG

HUE \a
Angehängte Dateien:
#1823076
Lesenswert?

Hue \a schrieb:
> Ich werde aus den empfangenden Daten nicht schlau,

Im Großen und Ganzen weist Du nach, dass Deine Methode, die Baudrate des 
PC kontinuierlich zu ändern, Essig ist.  Das Ergebnis springt, und zwar 
immer ziemlich genau dann, wenn eine neue Standard-Baudrate erreicht 
ist, z.B. bei 2400 und 4803 Baud,  Warum der Sprung nicht immer bei dem 
exakten Erreichen der Standard-Baudrate ist, bleibt wohl ein Geheimnis 
Deines Programms.

Ein weiteres Geheimnis bleibt, warum Du nicht endlich die Methode 
änderst und einen der gemachten Vorschläge durchführst, sondern 
stattdessen das weiter betreibst, was weiter oben so schön als 
Zweifrontenkrieg bezeichnet wurde.

Ein C-Programm, das in Verbindung mit einem Terminalprogramm die 
Baudrate (und diesmal wirklich kontinuierlich) ändert, wurde bereits 
vorgeführt.  Mach das mal.

(P.S. Wenn Dein Problem im Handling eines C-Programms liegt („wie kriege 
ich das ans Laufen?“: das hättest Du in dieser Zeit längst gelöst.  Oder 
in Assembler geschrieben.)
OP #1823160
Lesenswert?

Hurra,

ein Fehler im Quelltext:
            ldi  r17,LOW(103)
            ldi  r16,HIGH(103)
            out  UBRRH,r16
            out  UBRRL,r17

habe ich ersetzt durch:


            ldi     r17,103
            ldi     r16,0
            out     UBRRH,r16
            out     UBRRL,r17

Jetzt geht es, also kein Fehler in der Taktung vom Chip! Ich bin 
erleichtert,
VIELEN DANK für Eure Hilfen. Wirklich!

MfG

HUE \a

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren