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.