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

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