Forum: Mikrocontroller und Digitale Elektronik UART sendet immer gleiches zeichen


von Wastl F. (rescuetigerchen)


Lesenswert?

Guten Morgen!

Nachdem ich gestern einige Stunden damit zugebracht habe, den Uart zum 
laufen zu bekommen, frage ich euch.
Zuvor noch: ich habe mit dem Atmega8 sowie Atmega128 bereits Erfolg 
gehabt, bin mir also (ziemlich) sicher was ich da tue.
Im moment verwende ich einen Atmega1284P und einen Max232 (nach 
Datenblatt beschaltet) auf einer Platine. Kommunikation klappt, Baudrate 
mit Oszi gemessen (38400) stimmt auch. Eingestellt sind 1 Start, 8 Daten 
und 1 Stop.
Es wird egal welches Zeichen ich vom Atmega sende, immer nur 0x80 mit 
Hterm empfangen.
1
#include <stdio.h>
2
#include <avr\io.h>
3
#include <avr\interrupt.h>
4
5
volatile int ms;
6
7
void wait_ms(int i){
8
  ms=0;
9
  do{
10
    }
11
  while(i>=ms);
12
}
13
14
int uart_putc(unsigned char c)
15
{
16
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
17
    {
18
    }                             
19
 
20
    UDR0 = 0x99;                      /* sende Zeichen */
21
    return 0;
22
}
23
 
24
 
25
/* puts ist unabhaengig vom Controllertyp */
26
void uart_puts (char *s)
27
{
28
    while (*s)
29
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
30
        uart_putc(*s);
31
        s++;
32
    }
33
}
34
35
int main(){
36
37
//init ports
38
DDRD  |= (1<<PD5);
39
40
//DDRB  |= (1<<PB2)|(1<<PB3)|(1<<PB4);
41
PORTB |= (0<<PB2)|(1<<PB4);
42
43
//timer2 for timing
44
TCCR2A |= (1<<WGM21);      //CTC mode
45
TCCR2B |= (1<<CS20)|(1<<CS21);
46
TIMSK2 |= (1<<OCIE2A);
47
OCR2A = 31;            //every ms (default 15)
48
49
//timer0 for PWM PV1
50
TCCR0A |= (1<<COM0A1)|(1<<WGM00);
51
TCCR0B |= (1<<CS00);
52
OCR0A = 0;
53
54
//timer1 for PWM PV2
55
TCCR1A |= (1<<COM1A1)|(1<<WGM10);
56
TCCR1B |= (1<<CS10);
57
OCR1A = 0;
58
59
//init uart
60
UCSR0A |= (1<<U2X0);
61
UCSR0B |= (1<<TXEN0);
62
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);
63
UBRR0 = 25;  
64
65
      
66
sei();
67
68
do{
69
  wait_ms(2);
70
  uart_puts("a");
71
  PORTB ^= (1<<PB2);
72
  }while(1);
73
74
return 0;
75
}
76
77
ISR(TIMER2_COMPA_vect){
78
  ms++;
79
  }
Die Timer dienen später zur PWM erzeugung, das toggeln als "Debugger" 
damit ich sehe, ob der µP noch tut.
Tips, Hinweise, Urteile?

Gruß,
wastlB

Ich habe testenshalber auch schon den UART1 initialisiert, gleiches 
Phänomen.

von mr. mo (Gast)


Lesenswert?

Wastl F. schrieb:
> int uart_putc(unsigned char c)
> {
>     while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
>     {
>     }
>
>     UDR0 = 0x99;                      /* sende Zeichen */
>     return 0;
> }

WO wird denn das "char c" da verarbeitet?

von Anonym (Gast)


Lesenswert?

Und warum schreibst Du in UDR0 immer 0x99 rein?

von Wastl F. (rescuetigerchen)


Lesenswert?

Ach ja, das ist zum Testen. Ich konnte nicht glauben, daß immer das 
gleiche Zeichen auftaucht. Daher habe ich direkt in den Puffer 0x99 
geschrieben. Aber trotzdem empfange ich immer ein 0x80.

von PittyJ (Gast)


Lesenswert?

Wenn du die Baudrate im Oszi vermessen hast, dann hättest du dir auch 
gleich noch das Bitmuster anschauen können. Stimmt das noch im Oszi?

von Stefan E. (sternst)


Lesenswert?

Wastl F. schrieb:
> Ach ja, das ist zum Testen. Ich konnte nicht glauben, daß immer das
> gleiche Zeichen auftaucht. Daher habe ich direkt in den Puffer 0x99
> geschrieben. Aber trotzdem empfange ich immer ein 0x80.

Und wie viele 0x80 bekommst du pro gesendetem 0x99?
Ich tippe mal auf 3.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wastl F. schrieb:
> mit Oszi gemessen
Gut, ein Oszi.
> Es wird egal welches Zeichen ich vom Atmega sende, immer nur 0x80 mit
> Hterm empfangen.
Und: was misst du mit dem Oszi auf der TX-Leitung vom uC?

von Wastl F. (rescuetigerchen)


Angehängte Dateien:

Lesenswert?

falsch getippt. es kommt nur eins, gefolgt von einem "\n".
Im Anhang noch der relevante Schaltplanteil, kann ich mir aber 
eigentlich nicht vorstellen, daß da was schiefgeht...aber man weiß ja 
nie

von Stefan E. (sternst)


Lesenswert?

Wastl F. schrieb:
> falsch getippt.

Ja, war etwas zu schnell abgeschickt, sollte eigentlich ein 0x80 und 
zwei Breaks sein. Schicke doch mal bitte 0x55. Wenn du dann 5 0x80 
bekommst, dann ist die CKDIV8-Fuse gesetzt.

von Wastl F. (rescuetigerchen)


Lesenswert?

Da ich nur ein analoges Oszi habe, und im moment keine Cam zur hand 
poste ich das mal als "quasi"-AScii-Art:
Mega-Max: --_-__--__--
Max-PC:   _-_--__--_
Am Anfang und am Ende jeweils High (Mega-Max) bzw. low (Max-PC).
Es scheinen ja dann 10 bit (8 daten, 1 start und 1 stop) zu 
sein...Sollte der Uart nicht zwischen den Übertragungen auf Low gehen 
(zwischen Mega-Max)?

von Wastl F. (rescuetigerchen)


Lesenswert?

ich trottel....ich habe es geahnt. ich hab die ckdiv natürlich nicht 
beachtet...nun kommen brave 0x99.
thanks a bunch, nun kann ich endlich wieder ruhig schlafen. den fehler 
macht man nur einmal!

viele grüße,
wastlB

von Willi W. (williwacker)


Lesenswert?

Wastl F. schrieb:
> ich trottel....ich habe es geahnt. ich hab die ckdiv natürlich nicht
> beachtet...nun kommen brave 0x99.
Ist allen schon passiert
> thanks a bunch, nun kann ich endlich wieder ruhig schlafen. den fehler
> macht man nur einmal!
NEIN! immer und immer wieder aber immer seltener
>
> viele grüße,
> wastlB
Willi

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.