Einfachste USART ansteuerung funktioniert nicht.

#2329574
Lesenswert?

Hallo!

Also es tut mir leid, dass ich wahrscheinlich der 100ste bin, der diese 
Frage im Forum postet; aber trotz langer Recherche hier im Forum konnte 
ich den Fehler im Code nicht finden.

Eigentlich bin ich ja strikt nach dem Tutorial vorgegangen, aber es 
funktioniert einfach nicht.

Also: hier mal der mein Code:
----


#define F_CPU 1000000UL
#define BAUD 4800UL

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error BAUDRATEN ERROR!
#endif

#include <avr/io.h>
#include <stdlib.h>

void uart_init(void)
{
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;

  UCSRB = (1<<RXEN)|(1<<TXEN);
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int uart_putc(unsigned char d)
{
    while (!(UCSRA & (1<<UDRE)))
    {
    }

    UDR = d;
    return 0;
}


uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))
        ;
    return UDR;
}

int main(void)
{
  uart_init();
   DDRA  = 0xFF;             //
   DDRB  = 0xFF;             //
   PORTB = 0x03;             // Statusleds,  AVR arbeitet

  while (1)
  {


    if ( (UCSRA & (1<<RXC)) )
    {
      uint8_t c;
      c = uart_getc();
    uart_putc(c);

      PORTA = c;
    }
    else
    {

    }
  }
  return 0; // never reached
}
----

Zu den Randbedingungen:

µC: ATmega16
Ich spreche ihn über das Atmel Evaluations-Board V 2.0.1 an (bzw. 
programmiere den µC auch mit diesem (via ISP Schnittstellenadapter - mit 
AVRDude (AVR8 Burn o Mat v2)

Den String sende ich mittels hTerm als auch mit einem von mir 
programmierten Tool (in VB.net - erfolgreich getestet mittels virtual 
Serial Port) an das Board (und ja, natürlich nutze ich die RS232 
Schnittstelle zum ansprechen des µC und nicht die ISP Schnittstelle - 
des weiteren sind auch die Jumper für die Ansteuerung von RX und TX 
richtig gesetzt).

Danke im Voraus für die Hilfe!

lg
Peter

Ich bitte um eure Hilfe - allein schaffs ich glaub ich nicht - nach 3h 
Fehlersuche fast am verzweifeln.
Moderator (Firma: Titel) Persönliche Seite #2329641
Lesenswert?

Peter S. schrieb:
> aber trotz langer Recherche hier im Forum konnte
> ich den Fehler im Code nicht finden.
Wenn man den Fehler im Code partout nicht findet, ist es oft so, dass 
der Fehler nicht im Code ist...

> Ich bitte um eure Hilfe - allein schaffs ich glaub ich nicht
Steck mal den uC aus und brücke dann dort die Pins RX und TX. Und jetzt 
gibst du ein Zeichen im Terminalprogramm ein und kontrollierst, ob du es 
zurückbekommst. Eine positive Gegenprobe ist, wenn du keines mehr 
zurückbekommst, sobald du die Brücke wieder aufmachst (sonst ist lokales 
Echo aktiv, dann müsstest du für jedes ausgegebne Zeichen 2 gleiche 
zusückbekommen).
Wenn das geht, dann funktioniert mal deine Hardware bis und vom uC.
(Es könnte allerdings noch sein, dass RX und TX vertauscht sind...)

> - nach 3h Fehlersuche fast am verzweifeln.
Du hast aber ein niedriges Frustniveau...  :-o
Gast #2329680
Lesenswert?

> Stimmt denn die Baudrate?
Die ist mit 4800 im Terminal Prog eingestellt

> Hast du ein Oszi zur Hand?
Nein leider - ist nicht im Budget :(

>> Ich bitte um eure Hilfe - allein schaffs ich glaub ich nicht
>Steck mal den uC aus und brücke dann dort die Pins RX und TX. Und jetzt
gibst du ein Zeichen im Terminalprogramm ein und kontrollierst, ob du es
zurückbekommst. Eine positive Gegenprobe ist, wenn du keines mehr
zurückbekommst, sobald du die Brücke wieder aufmachst (sonst ist lokales
Echo aktiv, dann müsstest du für jedes ausgegebne Zeichen 2 gleiche
zusückbekommen).
Wenn das geht, dann funktioniert mal deine Hardware bis und vom uC.
(Es könnte allerdings noch sein, dass RX und TX vertauscht sind...)
Danke für diesen Tip!
Bin gerade bei der Arbeit, werd dies aber sofort probieren, wenn ich 
zuhause bin.

Da jedoch das Board 2 Tage alt ist, und der µC 2 Wochen hoffe ich doch, 
dass es kein Hardwarefehler ist....

---
Was ich noch anführen möchte:
Ich verwende als Verbindung zum Board ein USB to RS232 Kabel. Könnten 
sich darin eigentlich Bugs verstecken. Der Treiber wurde richtig 
installiert und die COM Schnittstelle wird erkannt. (Betriebssystem 
Windows 7 - 64bit) - und beschreiben lässt sich der µC ja auch mit 
diesem Kabel.
#2329722
Lesenswert?

Peter S. schrieb:

> Da jedoch das Board 2 Tage alt ist, und der µC 2 Wochen hoffe ich doch,
> dass es kein Hardwarefehler ist....

Darum gehts nicht.
Aber zwischen µC und PC ist ein Kabel und das gibt es in 2 Ausführungen. 
Einmal mit den Adern gekreuzt und einmal gerade durchverbunden. Wenn du 
das falsche hast, dann geht nichts.
Mit dem Test kannst du erst mal fststellen, ob soweit alles in Ordnung 
ist.

Dann: Für deine weiteren Tests nimmst du vom µC aus erst mal nur das 
Senden in Betrieb. D.h. dein µC sendet ständing und in einer Schleife 
ein bestimmtes Zeichen (zb ein 'x'). Bei deinem Test müssen schon 2 
Dinge klappen, Empfangen und Senden. Senden könntest du relativ leicht 
testen aber Empfangen kannst du nur über Umwege durchprüfen. Also lass 
es fürs erste weg und konzentrier dich auf die Dinge, die du prüfen 
kannst.
Lass deinen µC in einer Schleife ein 'X' senden. Zur Not kann man das 
UART-Signal auch mit einer LED vom µC-Pin bis hin zum Stecker, Kabel und 
PC verfolgen. Bei 4800 Baud sieht man die LED noch wunderbar flackern.
Gast #2329800
Lesenswert?

>> #define F_CPU 1000000UL
>Läuft deine CPU auch mit der angegebenen Frequenz (Quarz, Fuse-Bits)?

jop, sollte damit laufen. Habe bei der Taktfrequenz nichts umgestellt - 
und der ATmega16 läuft ja von Haus aus mit 1MHz.
#2329857
Lesenswert?

Lothar Miller schrieb:
> Peter S. schrieb:
>> und der ATmega16 läuft ja von Haus aus mit 1MHz.
> Oha, interner Takt und RS232...
> Viel Glück damit.

naaaja, 1MHz und 4800er Baudrate sollte drin sein.
An deiner Stelle würde ich erstmal das Senden µC->PC testen, kannst auch 
zum minimalen Debug ne LED an die TX Strippe hängen und das Senden in 
einer While-Schleife mit nem kleinen Delay zyklisch ablaufen lassen.
Es sollten Unterschiede in der Helligkeit der LED erkennbar sein, wenn 
das Ding sendet.

MfG
#2329883
Lesenswert?

Lothar Miller schrieb:
> Markus Oberle schrieb:
>> naaaja, 1MHz und 4800er Baudrate sollte drin sein.
> Die absolute Geschwindigkeit tut nichts zur Sache, wenn die
> Abweichung (des Taktes an sich) zu groß ist...

Jitter, Temperaturdrift....alles Käse :D
Aber ja, mit dem ATmega168 mit internen 8MHz Takt und 115200 Baudrate 
hatte ich auch schon so meine Probleme, aber mit Oszi lässt sich das 
recht schnell detektieren.
Auftrag erkannt: Quarz anbringen!
Gast #2329911
Lesenswert?

Wenn ich das richtig verstehe, würde aber eine zu große Abweichung des 
Taktes, sich hauptsächlich in falschen Zeichen bemerkbar machen 
(vorausgesetz die Abweichung ist nicht 1 kbps zu 10 kbps oder sowas). 
D.h. mann hätte immer noch die möglichkeit zu sehen, dass überhaupt was 
übertragen wird.

Und ob am µC was ankommt, kann man auch recht einfach über z.B. eine LED 
rausfinden.
#2331335
Lesenswert?

Erstmal danke für die vielen Tipps.
Hab eure Ratschläge befolgt - das sind die Ergebnisse:

1) RX und TX an USB to Serial Kabel gebrückt: Gesendetes Zeichen = 
empfangenes Zeichen --> Kabel OK

2) RX und TX nach Max232N gebrückt: Gesendetes Zeichen = empfangenes 
Zeichen

3) RXD und TXD Pins direkt am µC verbunden.
Ich empfange irgendwelche Zeichen, wenn ich diese Verbindung durchführe.
Auch die Leds, die ich an den PORT A pins angeschlossen habe leuchten 
Teilweise.

Diese Ergebnisse machen mich irgendwie stutzig...
Die gesamte Hardware funktioniert (Kabel, Max232N, ext.) und anscheinend 
der µC auch.

Was kann ich sonst noch machen?
#2331356
Lesenswert?

So noch einige Infos:

1) Hab meine "main" folgendermaßen abgehändert:
1
int main(void)
2
{
3
  uart_init();
4
  while (1) 
5
  {
6
  
7
  uart_putc('A');
8
  }
9
  return 0; // never reached 
10
}
Der µC sollte nun durchgehend ein "A" senden - es kommt jedoch nur 
machmal ein "A" an, ansonsten irgendwelche andren Zeichen. Gut, könnte 
ein Problem mit der Baud Rate sein - OK - aber wenigstens sender der µC 
was.

2) Hab den Tipp von Oliver J. befolgt:
>Nimm mal den µC aus dem Sockel und teste nochmal ob ein Echo kommt.

Habe die entsprechenden Ports gebrückt. Wenn ich nun vom PC etwas senden 
- dann kommt nichts zurück. Manchmal kommt was ein (ca. 3 Zeichen) auch 
wenn ich NICHTS sende.
Wo kann denn da ein Problem bei der Fassung liegen?

Übrigends: hab extra nochmal nach dem MAX232N gebrückt. Zeichen kommen 
fehlerfrei zurück.
#2331413
Lesenswert?

Peter S. schrieb:
> hab extra nochmal nach dem MAX232N gebrückt

Bei den vielen Test ist vielleicht etwas Verwirrung entstanden.
Was heißt "nach"? Welche Seite ist das?

Stelle doch noch mal alle Tests und die Ergebnisse übersichtlich 
zusammen.

Du weißt ja hoffentlich: brücken sollte man nur, wenn eine Seite nicht 
mehr angeschlossen ist. Sonst gibt es Kurzschluss. Auch wenn eventuell 
nichts zerstört wird, ist zumindest das Testergebnis zweifelhaft...

Also:
- Brücken von RXD und TXD am Kabel zum PC: Stecker ziehen (= MAX232 
abklemmen)
- Brücken von RXD und TXD am µC: µC entfernen

Gruß Dietrich
Gast #2331435
Lesenswert?

Also nochmal zu meinen Ergebnissen:

1) Usb2RS232: Usb mit PC verbunden: RS232 pin 2 und 3 verbunden (max232 
nicht angeschlossen): Gesendetes zeichen = empfangenes Zeichen

2) Usb2Rs232 an max232 angeschlossen: uC entfernt: send und receive pin 
verbunden: gesendetes zeichen = empfangenes zeichen

3) Usb2Rs232 an max232 angeschlossen: uC entfernt: am IC sockel werde 
die anschlüsse von RXD und TXD pins des uC verbunden (kurzgeschlossen). 
Zeichen wird gesendet, aber keines kommt am PC an.

4) Usb2Rs232 an max232 angeschlossen: uC angeschlossen: RXD und TXD 
werden verbunden: uC sendet irgendwelche zeichen

5) Dauersenden des uC des Zeichens 'A': es kommen zeochen am PC an, aber 
nur zwischendurch wird ein A empfangen (event. Problem m. Baudrate)

Ich hoffe, dass die Verwirrung nun beseitigt ist.
#2331443
Lesenswert?

Peter S. schrieb:
> 2) Usb2Rs232 an max232 angeschlossen: uC entfernt: send und receive pin
> verbunden: gesendetes zeichen = empfangenes zeichen
>
> 3) Usb2Rs232 an max232 angeschlossen: uC entfernt: am IC sockel werde
> die anschlüsse von RXD und TXD pins des uC verbunden (kurzgeschlossen).
> Zeichen wird gesendet, aber keines kommt am PC an.

Wenn bei 2) der MAX232 noch an der Leitung zum µC angeschloosen war, 
kann das nur heißen: falsche Verbindung zum µC.

Wenn bei 2) der MAX232 von der Leitung zum µC abgeklemmt war: an den 
Leitungen zum µC hängt noch was anderes, z.B. ein Kurzschluss o.Ä.

Also mit fällt da nur ein Verdrahtungsfehler ein.

Gruß Dietrich
#2331491
Lesenswert?

Peter S. schrieb:
> 10-12 hab ich gemssen / die werden auf dem Board mittels Jumper zum µC
> geschlossen

Du hast also Pin12 mit Pin10 verbunden, in dem du JP1 und JP2 auf der 
MAX232-Seite verbunden hast?

Wenn ja dann liegt der Fehler in der Verdrahtung oder der MAX232 ist 
defekt oder vielleicht verkehrt herum im Sockel.

Klingel mal das Kabel durch, ob PIN2 und PIN3 1:1 durchverdrahtet und 
nicht gekreuzt sind. Das Pollinboard erwartet nämlich eine 1:1 
Verdrahtung.

Gruß Oliver
#2331494
Lesenswert?

>Du hast also Pin12 mit Pin10 verbunden, in dem du JP1 und JP2 auf der
>MAX232-Seite verbunden hast?
Ja, genau so hab ichs gemacht

>Wenn ja dann liegt der Fehler in der Verdrahtung oder der MAX232 ist
>defekt oder vielleicht verkehrt herum im Sockel.
Max232 ist richtig im Sockel

>Klingel mal das Kabel durch, ob PIN2 und PIN3 1:1 durchverdrahtet und
>nicht gekreuzt sind. Das Pollinboard erwartet nämlich eine 1:1
>Verdrahtung.
Wie kann ich das genau feststellen, ob es sich um eine 1:1 Verdrahtung 
handelt?
#2331517
Lesenswert?

Liegen am MAX232 5V an (PIN16)?
Liegen am MAX232 die von ihm erzeugten +-10V an (Pin2 und Pin6)?

Wenn die Spannungen da sind, dann versuche mal das:

Entferne mal JP1 und lege mal 5V an PIN10 des MAX232 an. Und miss mal 
jetzt mal die Spannung an PIN7. Mach das ganze nochmal mit 0V an PIN10.


Dabei sollte ungefähr sowas rauskommen:


PIN10  |  PIN7
-------+--------
  5V   |  -10V
  0V   |  +10V

Könnte auch betragsmäßig etwas weniger als 10V sein. Wenn das 
funktioniert, dann arbeitet der MAX232 in µC-Senderichtung und sollte 
Zeichen vom µC an den Rechner weiterleiten sofern denn:
- Baudrate stimmt auf beiden Seiten
- Die Verbindung vom MAX232 zum µC einwandfrei ist


Lass mal ein Licht im Sekundentakt blinken, dann siehst du, ob der Takt 
und somit die Baudrate mit dem übereinstimmt, was im Quellcode angegeben 
ist.


Gruß Oliver
#2331540
Lesenswert?

Peter S. schrieb:
> Also, zwischen Pin 16 (Vcc) und Pin 15 (GND) liegen 0V an.

Das Board wird doch versorgt. Richtg?

Wenn ja, dann scheint der MAX232 keine 5V vom 7805 abzubekommen. Vllt 
ein Haarriss auf der Platine. Dann könnte es helfen, an PIN16 des MAX232 
mal direkt an 5V anzuschließen. 5V kann man z.B. am 40-Poligen 
Wannenstecker abgreifen (36, 38, 40).

Gruß Oliver
#2331567
Lesenswert?

Peter S. schrieb:
> Aber wieso funktioniert dann das senden/empfangen, wenn ich JP1 mit JP2
> verbinde?

Dachte das funktionert nicht. Sorry

Ist dein Multimeter kaputt? Denn diese Spannungen (5V 10V -10V) müssen 
am MAX232 anliegen, sonst könnte das nicht funktionieren.

OK.

Also funktioniert die Übertragung bis zur TTL-Seite des MAX232.

Klingel mal durch ob die Verbindung vom MAX zum µC existiert (bitte 
Versorgungsspannung entfernen)
#2331580
Lesenswert?

Oliver J. schrieb:
> Peter S. schrieb:
>> 5) Dauersenden des uC des Zeichens 'A': es kommen zeochen am PC an, aber
>> nur zwischendurch wird ein A empfangen (event. Problem m. Baudrate)
>
> Die Verbindung wird also auch da sein.
>
> Ok.
>
>
> Lass mal eine LED im Sekundentakt blinken...

Mein Hauptproblem (vorerst) ist nicht das Problem mit der BAUD Rate, 
also dass nur Zwischendurch ein A empfangen wird.

Mein Problem ist, dass wenn ich RXD und TXD Pin am Sockel meines µC 
verbinde, und dann vom PC ein Zeichen sende, dieses Zeichen nicht 
empfangen wird.
#2331582
Lesenswert?

Peter S. schrieb:
> Mein Problem ist, dass wenn ich RXD und TXD Pin am Sockel meines µC
> verbinde, und dann vom PC ein Zeichen sende, dieses Zeichen nicht
> empfangen wird.

Mach mal ein Foto vom Board. Beide Seiten bitte. Kann ruhig etwas höher 
aufgelöst sein.


PS. vielleicht hilft es auch alle betreffenden Lötstellen mal 
nachzulöten (eventuell kalte Lötstelle).
#2331693
Lesenswert?

>Julian R. schrieb:
>> Also nach dem, was man hier so liest, würd' ich auf einen defekten
>> MAX232 tippen...(NUR EINE VERMUTUNG!)
>> Hast du eventuell einen zweiten da?
>>
> julian

>Der scheint zu funktionieren. Er bekommt ja ein Echo, wenn der RX und TX
>auf der TTL-Seite kurzschließt.

>Gruß Oliver

Also, ich glaub schon dass der MAX232 funktioniert - wie gesagt, es gibt 
ein echo, wenn ich RX und TX kurzschließe.

@Oliver - Bilder sind jetzt hochgeladen

Der Bug muss irgendwo zwischen MAX232 und µC liegen (der µC müsste 
eigentlich OK sein)
Angehängte Dateien:
#2331699
Lesenswert?

>Der Bug muss irgendwo zwischen MAX232 und µC liegen (der µC müsste
>eigentlich OK sein)

So
hab jetzt nochmal genauer die Sockelpins von RXD und TXD kurzgeschlossen 
(Lötverbindung).

Das gesendete Zeichen = das empfangene Zeichen am PC

d.h.: es kann eigentlich nur mehr am µC liegen - also am Programm 
Code... Nur warum funzt es nicht?
Gast #2331702
Lesenswert?

Hallo,
eventuell ist dein USB-Seriell-Umsetzer sehr baudratenkritisch?
Mit 10MHz Clock am Atmel triffst du die Baudrate nicht genau.
Falls du einen "Baudratenquarz" zur Hand hast, würde ich es mal damit 
probieren.
Falls kein passender Quarz zu Hand ist, würde ich es mit 1200Baud 
probieren, eventuell sind die Fehler dann weg oder viel seltener.
#2331706
Lesenswert?

> Mit 10MHz Clock am Atmel triffst du die Baudrate nicht genau.

Läuft aber mit 1MHz. Ist das hier mit der Baudrate gleich kritisch?
1
#define F_CPU 1000000UL
2
#define BAUD 4800UL
3

4
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
5
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
6
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
7

8
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
9
  #error BAUDRATEN ERROR!
10
#endif

Eigentlich überprüfe ich ja mit diesem Code, ob die Abweichung der 
Baudrate noch ok ist, oder?
#2331709
Lesenswert?

Die meisten Funktionsprobleme bei UART sind auf MCU-seitig falsch 
eingestellte Baudrate zurückzufühen. Die Baudrate wird bei dir per 
Präprozessor abhängig von der F_CPU berechnet. Wenn F_CPU nicht mit dem 
realen Prozessortakt übereinstimmt, dann stimmt auch die Baudrate nicht. 
Läuft denn dein AVR wirkilch mit 1 MHz? Sind es eventuell 8MHz oder 
sogar die 16 MHz vom Quarz?

Prüfe das mal nach, indem du eine LED blinken lässt.

Gruß Oliver
Gast #2331726
Lesenswert?

Beim ATMEGA32 gilt:

The device is shipped with CKSEL = “0001” and SUT = “10”. The default 
clock source setting is
therefore the 1 MHz Internal RC Oscillator with longest startup time. 
This default setting ensures
that all users can make their desired clock source setting using an 
In-System or Parallel
Programmer.
#2331730
Lesenswert?

Thomas R. schrieb:
> Beim ATMEGA32 gilt:
>
> The device is shipped with CKSEL = “0001” and SUT = “10”. The default
> clock source setting is
> therefore the 1 MHz Internal RC Oscillator with longest startup time.
> This default setting ensures
> that all users can make their desired clock source setting using an
> In-System or Parallel
> Programmer.

Jop - genau das gilbt beim ATmega16 auch. Also sollte er mit 1MHz 
laufen, wenn ich das richtig verstehe
#2331734
Lesenswert?

Thomas R. schrieb:
> Dann benutzt du also den RC-Oszillator!?!
> Wahrscheinlich reicht dessen Genauigkeit nicht für den UART.
> Auf deinen Platinenfotos sind doch so schöne Quarze und du verwendest
> sie nicht!

Na ja, dass ist ne andere Sache - hab mich nocht nicht genau genug damit 
beschäftigt, wie ich die Quarze des Boards verwenden kann. Einfach fuses 
umstellen?

Die Dokumentation des ATMEL Evaluation Boards ist nicht sehr gut. Auf 
dem Board sind 2 16MHz und 1 8MHz Quarz. Die Frage ist, wie ich die 
anwähle.
#2331737
Lesenswert?

Thomas R. schrieb:
> Hallo,
> eventuell ist dein USB-Seriell-Umsetzer sehr baudratenkritisch?
> Mit 10MHz Clock am Atmel triffst du die Baudrate nicht genau.
> Falls du einen "Baudratenquarz" zur Hand hast, würde ich es mal damit
> probieren.
> Falls kein passender Quarz zu Hand ist, würde ich es mit 1200Baud
> probieren, eventuell sind die Fehler dann weg oder viel seltener.

1200 Baud funktioniert auch nicht
#2331760
Lesenswert?

Peter S. schrieb:
> Thomas R. schrieb:
>> For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed
>> and 16 MHz with CKOPT programmed.
>>
>> F_CPU 16000000UL
>>
>> Wenn die LED dann 1 mal/Sekunde blink, ist der Takt genau 16Mhz.
>
> Kannst du mir sagen, wie ich die fuse bits genau setzen muss?

Liege ich in der Annahme richtig, wenn ich die Fuse Bits wie folgt 
setze:

CKSEL = 1111
SUT = 11
#2331799
Lesenswert?

Thomas R. schrieb:
> mit
> F_CPU 16000000UL
> passt das doch.
> mit
> F_CPU 1000000UL
> müsste sie 16* pro sek blinken

Ne, ich hatte noch 1Mhz eingestellt.

So, hab jetzt die Fuse bits geändert und nochmal mein ursprüngliches 
Porgramm draufgespielt
1
#define F_CPU 16000000UL
2
#define BAUD 1200UL
3

4
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
5
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
6
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
7

8
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
9
  #error BAUDRATEN ERROR!
10
#endif
11

12
#include <avr/io.h>
13
#include <stdlib.h>
14

15
void uart_init(void)
16
{
17
  UBRRH = UBRR_VAL >> 8;
18
  UBRRL = UBRR_VAL & 0xFF;
19

20
  UCSRB = (1<<RXEN)|(1<<TXEN);
21
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
22
}
23

24
int uart_putc(unsigned char d)
25
{
26
    while (!(UCSRA & (1<<UDRE)))
27
    {
28
    }
29

30
    UDR = d;
31
    return 0;
32
}
33

34

35
uint8_t uart_getc(void)
36
{
37
    while (!(UCSRA & (1<<RXC)))
38
        ;
39
    return UDR;
40
}
41

42
int main(void)
43
{
44
  uart_init();
45
   DDRA  = 0xFF;             
46
   DDRB  = 0xFF;             
47
   PORTB = 0x03;             
48

49
  while (1)
50
  {
51

52

53
    if ( (UCSRA & (1<<RXC)) )
54
    {
55
      uint8_t c;
56
      c = uart_getc();
57
    uart_putc(c);
58

59
      PORTA = c;
60
    }
61
    else
62
    {
63

64
    }
65
  }
66
  return 0; // never reached
67
}

Es Tut sich jedoch noch immer nichts...
Gast #2331810
Lesenswert?

Ich verwende AVR-Studio 4 und kenne 5 nicht.
Was passiert, wenn du den 16MHz-Quarz auslötest?
Wenn der ATMEGA dann weiter läuft, läuft immer noch der interne 
Oscillator.
Dann würden die Fuse-Bits nicht stimmen.
#2332295
Lesenswert?

Oliver J. schrieb:
> Wie setzt du deine Fuses?

Er sollte seine Fuses mit BURN O MAT setzen, warum er jedoch das 
Häckenzeug benutzt anstatt den Letzten Tab mit Oscillatoroptions, 
verstehe ich ned!
Des letzt Bild auf folgender Seite zeigt, dass er das ganze Fuses 
gewurstelle auch mit drei Mausklicks erledigen könnte:
http://tuefftler.de/miko_1-1-4.html

julian

PS: des mit dem MAX232 war nur so ne Vermutung, weil er geschrieben 
hatte:
Peter S. schrieb:
> 3) RXD und TXD Pins direkt am µC verbunden.
> Ich empfange irgendwelche Zeichen, wenn ich diese Verbindung durchführe.
> Auch die Leds, die ich an den PORT A pins angeschlossen habe leuchten
> Teilweise.
Darum hatte ich geglaubt, der MAX232 wäre hin!
Gast #2332414
Lesenswert?

USART-Gast schrieb:
> Hast du mal ins Datenblatt geschaut:
> UBBR=fosc/(16*Baud)-1 (reichelt Datenblatt Version für den atmega 16 im
> dip - seite 140)
>
> Das passt nicht zu deiner Formel.
>
> Gruß
>   Gast

Also ich jab mich strikt ans avr-gcc tutorial aus dem Forum gehalten. 
Werd diese Änderung am donnerstag durchführen.


@USART-GAST
hab mir gedacht, wenn ich die fuses per hand setze (16 Mhz siehe oben) 
dann dann nichts schiefgehen. Vielleicht war meine Annahme ja Falsch.

Lg
#2332472
Lesenswert?

USART-Gast schrieb:
> Hast du mal ins Datenblatt geschaut:
> UBBR=fosc/(16*Baud)-1 (reichelt Datenblatt Version für den atmega 16 im
> dip - seite 140)
>
> Das passt nicht zu deiner Formel.
>
> Gruß
>   Gast

Mit der Formel aus dem Datenblatt würden einfach die Nachkommastellen 
abgeschnitten werden. Sprich wenn 39.9 das exakte Ergebnis wäre, dann 
wäre das Ergebnis durch den Präprozessor 39. Das macht den Fehler 
natürlich unnötig groß. Wie man offensichtlich sehen kann, wäre 40 
besser geeignet. Da kommt die Formel aus dem Tutorial ins Spiel. Um ab 
x.5 immer aufzurunden, hat man im Zähler einfach noch mal den halben 
Nenner drauf addiert.


Gruß Oliver
Gast #2332677
Lesenswert?

Das Tut. habe ich mir vorhin mal angesehen.
Ich habe bisher mit der Formel aus dem Datenblatt gearbeitet, jedoch per 
Hand. Da habe ich dann wohl selbst immer richtig gerundet. Gut, es waren 
bisher auch erst drei verschiedene UBBRs (1MHz-2400Baud; 8MHz-2400Baud; 
8MHz-9600Baud). Alles mit internem Takt auf den Mega8535s. Funktioniert 
wie es soll, nur die IR-Übertragung macht teilweise ein paar Probleme, 
aber das gehört hier nicht hin ;)

Und die Formel aus dem Tut. mal einfach:
UBBR=fosc/(16*Baud)-0.5
Aber das wäre ja zu einfach. Hätte ich auch gleich sehen können. Aber 
das der Präprozessor nicht rundet, sondern abscheidet muss man einfach 
wissen. War bei mir nicht der Fall.
Gast #2336901
Lesenswert?

Peter S. schrieb:
> Ich hoffe, das dass Problem jetzt gefunden wird.

Ein Problem hast Du doch schon, da muss man keins mehr finden, Du 
möchtest daß die Lösung gefunden wird. ;D

Peter S. schrieb:
> Die ist mit 4800 im Terminal Prog eingestellt

Bei Win7 bin ich mir nicht sicher, aber üblicherweise musst Du die 
Baudrate in der Systemsteuerung für die entsprechende Com-Schnittstelle 
einstellen. Einstellungen im Terminal dürften ohne Wirkung sein.
#2336923
Lesenswert?

MWS schrieb:
> Peter S. schrieb:
>> Ich hoffe, das dass Problem jetzt gefunden wird.
>
> Ein Problem hast Du doch schon, da muss man keins mehr finden, Du
> möchtest daß die Lösung gefunden wird. ;D

Tja, da hast du vollkommen recht...

> Peter S. schrieb:
>> Die ist mit 4800 im Terminal Prog eingestellt
>
> Bei Win7 bin ich mir nicht sicher, aber üblicherweise musst Du die
> Baudrate in der Systemsteuerung für die entsprechende Com-Schnittstelle
> einstellen. Einstellungen im Terminal dürften ohne Wirkung sein.

Hab im Gerätemanager nachgeschaut - war tatsächlich eine falsche 
Baudrate eingestellt - hab sie auf die gewünschten 1200 Bit/s geändert, 
aber ohne Erfolg. Problem besteht noch immer
#2336931
Lesenswert?

MWS schrieb:
> Poste doch mal den letzten C-Code als auch das erzeugte Hexfile.
> Wie schnell rennt der µC denn jetzt im Moment ? Int. RC oder ext. Quarz,
> Fuses immer noch wie hier ?
> Beitrag "Re: Einfachste USART ansteuerung funktioniert nicht."

So, aktuelle Einstellung ist auf Int. RC 8MHz.

Fuses, und Projekt Files (C Code, HEX Code, ext) siehe Anhang
Angehängte Dateien:
Gast #2336990
Lesenswert?

Hier passiert Dein Fehler, das .hex von Dir, wobei's egal ist, ob aus 
dem Debug oder Release Verzeichnis genommen:
1
  out  p20,r1
2
  ldi  r24,k0C
3
  out  p09,r24
Lädt das UBRR-Register mit 0x000C, entsprechend 38.4kBaud

Das hier von mir auf Basis Deines Quelltextes compilierte .hex ist 
dagegen richtig:
1
  ldi  r24,k01
2
  out  p20,r24
3
  ldi  r24,kA0
4
  out  p09,r24
UBBR = 0x01A0 = dec 416 = 1200 Baud
Keine Ahnung, was Du da machst.

Versuche anhängendes .hex
Angehängte Dateien:
#2337035
Lesenswert?

MWS schrieb:
> Peter S. schrieb:
>> Ok.... mit welchem compiler arbeitest du?
>
> Hab's gerade durch AVR-Studio5 geschickt auch das produziert richtige
> Einstellungen für UBRR, im Gegensatz zum .hex von Dir.

Also, das ist sehr strange...

Aber, ich habe einen Fehleransatz.
Hab gerade in die while schleife einfach ein Dauersenden des Zeichens 
eingetragen.
Bei Baud 1200 Bit/s kam nur am Anfang das richtige Zeichen an - danach 
irgendetwas....

Hab das die Databits im Terminal auf 7 geändert - und siehe da, das 
richtige Zeichen kam immer an.

Ich werde jetzt meinen oben geposteten Code mit 7 Databits testen - mal 
sehn, ob er dann funktioniert.
Gast #2337046
Lesenswert?

Peter S. schrieb:
> Hab im AVR Studio alles nochmal durchsimuliert. Mir fällt auf, das es
> das URSEL bit nicht setzt (siehe Grafik oben).

Doch, wird schon gesetzt.
1
23:         UCSRC = (1<<URSEL)|(3<<UCSZ0);
2
+0000003C:   E886        LDI       R24,0x86       Load immediate
3
+0000003D:   BD80        OUT       0x20,R24       Out to I/O location

0x86 = URSEL 0x80 + UCSZ1 0x04 + UCSZ0 0x02
#2337053
Lesenswert?

> Bei Baud 1200 Bit/s kam nur am Anfang das richtige Zeichen an - danach
> irgendetwas....
>
> Hab das die Databits im Terminal auf 7 geändert - und siehe da, das
> richtige Zeichen kam immer an.
>
> Ich werde jetzt meinen oben geposteten Code mit 7 Databits testen - mal
> sehn, ob er dann funktioniert.

Hab das nochmal durchprobiert - das Ergebnis wie oben beschrieben war 
NICHT reproduzierbar.

Vielmehr viel mir auf, dass bei mehrmaligen ändern der Baudrate (von 600 
auf 1200) nach manchen Änderungen dir richtigen Zeichen empfangen 
wurden.
Sprich

1x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
2x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
3x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
4x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
5x Ändern von 600 auf 1200 Bit/s: RICHTIGES ZEICHEN EMPFANGEN
6x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
7x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
8x Ändern von 600 auf 1200 Bit/s: irgendwas empfangen
9x Ändern von 600 auf 1200 Bit/s: RICHTIGES ZEICHEN EMPFANGEN

Ich glaub, dieser Hterm Terminal funzt nicht richtig.... oder ich hab da 
nen ziemlichen Bug in meinem System
Gast #2337057
Lesenswert?

Peter S. schrieb:
> Vielmehr viel mir auf, dass bei mehrmaligen ändern der Baudrate (von 600
> auf 1200) nach manchen Änderungen dir richtigen Zeichen empfangen
> wurden.

Der interne RC kann schon ordentlich neben der Spur sein, für einen 
Frequenzzähler hab' ich mal 8.3MHz einsetzen müssen.

Normalerweise sollten 2400 Baud mit dem internen RC keinerlei Problem 
darstellen, nur angenommen 8.3MHz / (16*(UBRR+1)) = 1244 Baud, ein 
Fehler von 3.7%, was schon über der Grenze ist. Eine instabile 
Stromversorgung könnte dem dann den Rest geben.

Würd' mal versuchen #define F_CPU 8000000UL nach oben und unten 
anzupassen. Eine Alternative wäre OSCCAL zu ändern, das könnte über 
Taster im laufenden Betrieb gemacht werden.

Vernünftigste Sache wär'n Quarz.
#2337070
Lesenswert?

Nochmal mit 16Mhz externen Quarz probiert.

Also, ich sende durchgehend ein Zeichen "A".

Folgendes Empfange ich:
AAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

wenn ich dann auf 7 datenbits ändere:
*<5><5><5><5><5><21><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5>
<5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5>
<5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5>
<5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5>
<5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5>
<5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5><5>
<5><5><5><5><5><5><5>

wenn ich wieder auf 8 datenbits ändere:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Gast #2337074
Lesenswert?

Peter S. schrieb:
> Die Dokumentation des ATMEL Evaluation Boards ist nicht sehr gut. Auf
> dem Board sind 2 16MHz und 1 8MHz Quarz. Die Frage ist, wie ich die
> anwähle.

Du scheinst mir über das Vorhaben-Stadium nicht hinaus gekommen sein.

Schau' Dir den Schaltplan an, der Mega16 müsste in Sockel IC6 sitzen und 
dann ist Q3 dafür zuständig, der 16MHz haben sollte.

Hier kannst Du nochmal schauen, ob Deine Einstellungen stimmen, befor Du 
ihn "brickst":
http://www.engbedded.com/fusecalc/

Für 16MHz sollte CKOPT programmiert sein.

Peter S. schrieb:
> Nochmal mit 16Mhz externen Quarz probiert.

Alles kontrolliert ? Fuseeinstellungen ?
RXD/TXD auf dem Board durchgemessen, keine Verbindungen zu Stellen, wo 
keine sein soll ? ATM16 steckt als einziger µC drin ?
#2337076
Lesenswert?

> Schau' Dir den Schaltplan an, der Mega16 müsste in Sockel IC6 sitzen und
> dann ist Q3 dafür zuständig, der 16MHz haben sollte.
Sitzt dort wo er soll - F_CPU hab ich jetzt auf 16MHz (da ichs ja mit 
ext. Quarz wieder mal versuche)

> Für 16MHz sollte CKOPT programmiert sein.
Ok, der ist Anscheinend bei mir nicht programmiert....

> Alles kontrolliert ?
Mehr als doppelt - MAX232 funzt / wenn ich RXD, TXD im Sockel 
kurzschließe ohne µC kommen auch alle Zeichen wieder zurück

> Fuseeinstellungen ?
Grad nochmal gepostet

> RXD/TXD auf dem Board durchgemessen, keine Verbindungen zu Stellen, wo
> keine sein soll ?
Ja, passt alles

> ATM16 steckt als einziger µC drin ?
ja
Angehängte Dateien:
#2337966
Lesenswert?

MWS schrieb:
> Auch Dein Originalcode läuft hier einwandfrei, nur angepasst auf 16MHz.
> Compiliert mit AVRStudio4, Optimierung -Os.

Danke! Funktioniert aber nicht bei mir... Verdammt, ich find den Fehler 
nicht...

> Beim Terminal gibt es neben "Baudrate" und "Anzahl Bits" auch noch
> "Anzahl Stop-Bits" und "Parity". Ist das richtig (= wie beim µC)
> eingestellt?

Stop-Bits: 1
Parity: None
Data Bits: 8
Baud: 1200 B/s

also das sollte schon zusammenpassen.
#2337996
Lesenswert?

HEUREKA!

Es funktioniert!


Aufgepasst der Fehler war folgender:

Ich hab an der 40-poligen Pfostenleiste eine Platine mit meinen Leds 
angesteckt. Und da waren RXD und TXD noch an ein versuchs LCD 
angeschlossen...
Da steckte das Problem!

Aber:
Im Atmel Evaluations-Board steht folgendes:
"Für umfangreiche Anwendungen sind nahezu alle verfügbaren Ports der 
Microcontroller wie Ports PA,PB,PC und PD auf eine 40(39)-pol. 
Pfostenleiste (Extension-Port) geführt und so leicht zugänglich. Mittels 
der Jumper JP1-8 und JP9-12 können die Ein- bzw. Ausgänge der Ports so 
geschaltet werden, dass diese Ports ENTWEDER mit den auf der Platine 
befindlichen LEDs, Taster oder den AC-Summer verwendet werden oder auf 
die Pfostenleiste geführt werden."

Warum, wenn es die Jumper gibt, werden die dann doch auf die 
Pfostenleiste geleitet?? Das versteh ich nicht ganz.
Gast #2338095
Lesenswert?

Peter S. schrieb:
>> RXD/TXD auf dem Board durchgemessen, keine Verbindungen zu Stellen,
>> wo keine sein soll ?
> Ja, passt alles

Peter S. schrieb:
> Ich hab an der 40-poligen Pfostenleiste eine Platine mit meinen Leds
> angesteckt. Und da waren RXD und TXD noch an ein versuchs LCD
> angeschlossen...

Hmm, das war dann aber die erste und einzige Erwähnung im ganzen Thread 
über eine angeschlossene Schaltung an der Extensionleiste.

Daß die RXD/TXD Pins dauerhaft an die Leiste gehen war nach Durchsicht 
des Schaltplans klar. Deshalb auch meine Frage ob noch andere 
Verbindungen bestehen.

Peter S. schrieb:
> Mittels
> der Jumper JP1-8 und JP9-12 können die Ein- bzw. Ausgänge der Ports so
> geschaltet werden, dass diese Ports ENTWEDER mit den auf der Platine
> befindlichen LEDs, Taster oder den AC-Summer verwendet werden oder auf
> die Pfostenleiste geführt werden."

Wie soll ein zweipoliger Jumper hier in der Lage sein, etwas 
umzuschalten ?
#2338598
Lesenswert?

Hallo!

Sorry, hab die Anmerkungen anscheinend falsch verstanden.... Tut mir 
leid dass ich vielen Leuten im Forum Zeit geraubt habe, da ich dieses 
Detail unterdrückt habe.

Peter S. schrieb:
>> RXD/TXD auf dem Board durchgemessen, keine Verbindungen zu Stellen,
>> wo keine sein soll ?
> Ja, passt alles

Das hab ich anscheinend falsch verstanden - hab nur das Atmel Evaluaions 
Board durchgemessen...

Wie gesagt - nochmals vielen Dank für die Hilfe!
#2338619
Lesenswert?

Oliver J. schrieb:
> MWS schrieb:
>> Hmm, das war dann aber die erste und einzige Erwähnung im ganzen Thread
>> über eine angeschlossene Schaltung an der Extensionleiste.
>
> "Error 40" nennt sich das - glaub ich.

na ja - ich behaubte, DAU ist ein wenig übertrieben - GNU währ eher 
angebracht... Hab die Verbindung zum 40er Pfosten eigentlich erstellt, 
um den Fehler besser einzukreisen....

Ging nach hinten los.

Wie gesagt - danke noch mal an alle. Ich hoffe ich kann aus den Fehlern 
lernen. Und wer weis, vielleicht kann ich ja mal in einigen Monaten 
etwas konstruktives im Forum beitragen, nach dem ich mich einigermaßen 
in die Materie eingearbeitet habe...

Zu meiner Verteidigung: bin kein Elektrotechniker - bin Maschinenbauer, 
also nochmal sry, wenn solche Verständnisfehler (wie bei den Jumpern) 
passieren...
Gast #2338771
Lesenswert?

Peter S. schrieb:
> Peter S. schrieb:
>>> RXD/TXD auf dem Board durchgemessen, keine Verbindungen zu Stellen,
>>> wo keine sein soll ?
>> Ja, passt alles
>
> Das hab ich anscheinend falsch verstanden - hab nur das Atmel Evaluaions
> Board durchgemessen...

Ja, nur wäre das der Zeitpunkt gewesen zu sagen: "... aber ich hab' da 
noch 'ne Cray 1  dran hängen, davon wisst Ihr noch nix..."

Auch wenn's eigentlich immer wieder das Gleiche ist: Lötbrücke, 
Kabeldefekt oder hoch kreative Auslegung von Angaben seitens des 
Nutzers, so hatte doch der Betrieb mit zusätzlicher Hardware ohne 
Nennung derselben ein neues Niveau.

Und darüber hatte ich mir nur kurz Luft machen müssen, quasi als 
Aaarrrggghhhhh-Ersatz.
#2338843
Lesenswert?

Auch noch von mir ein Tip:

Zu dem Board gibt es doch auch einen Schaltplan :-)). Den sollte man 
immer greifbar haben! So kann man bei solchen Fragen schnell mal die 
betroffenen Leitungen verfolgen und ist nicht auf Erinnerungen und die 
Deutung von Texten angewiesen.

Allgemein sollte man bei der Fehlersuche an allem zweifeln, Niemandem 
glauben - besonders auch sich selber nicht :-(
Das ist zwar ein etwas destruktives Verhalten, hilft aber in solchen 
Fällen.

Negative Folgen kann das allerdings auch haben: wenn ich z.B. meiner 
Frau gegenüber ebenso reagiere und bei irgendeiner Aussage gleich frage: 
Bist Du Dir sicher? Woher weißt Du das? Verwechselst Du da vielleicht 
was? Das gibt manchmal Ärger :-((

Gruß Dietrich

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