UART sendet immer gleiches zeichen

OP #2761179
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.
OP #2761196
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)?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.