Ich habe den yC getauscht von Atmega32 auf Atmega324P und nun habe ich da ein kleines problem. INT0 ist nun auch durch RXD1 belegt, und er zeigt beim Compilen den Fehler: ../main.c:150: error: 'GICR' undeclared (first use in this function) // Interrupt MCUCR = 0x02; // falling slope GICR |= (1<<INT0); // ADC ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // prescaler 256 ADMUX = (1<<REFS1) | (1<REFS0) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0); // internal 2,56V reference ADC7
oh man TIMSK gibts da auch nicht mehr // Timer init OVF TCNT1 = 0; TCCR1B |= (1<<CS12)|(1<<CS10); TIMSK |= (1<<TOIE1);
Allerlei Register und Bits heissen anders und wahrscheinlich sieht die Steuerung der externen Interrupts ein bischen anders aus. Es müsste von Atmel eine AN zu der Migration geben. Einen Konflikt zwischen INT0 und der zweiten UART kann es bei Portierung einer bestehenden Lösung nicht geben, denn in der wird die zweite UART naturgemäss nicht verwendet.
oooh man, son rotz da is ne ganze Menge anders selbst das SIGNAL() fuer UART ist ein anderes
>oooh man, son rotz da is ne ganze Menge anders selbst das SIGNAL() fuer >UART ist ein anderes Dass die beiden bis auf den Familiennamen nicht viel gemeinsam haben, hast du inzwischen festgestellt? Der ATmega324 dürfte der große Bruder des ATMega162 sein, und der hat auch nicht sooo viel mit dem Mega32 gemeinsam.
STK500-Besitzer schrieb: > Der ATmega324 dürfte der große Bruder des ATMega162 sein, und der hat > auch nicht sooo viel mit dem Mega32 gemeinsam. Gut multipliziert aber schlecht geraten. Der 324 ist der kleine Bruder des 644, und der ist mit dem 32 verwandt. Nur ist eben ziemlich viel umbenannt worden.
aber irgendwie muss sich das doch rausfinden lassen. z.B. wie das SIGNAL heiszt unsw..
Klar doch, dazu gibt es die Include Files und wenn alle Stricke reissen kann man in letzter Verzweiflung sogar die Doku der avr-libc lesen.
SIGNAL ist sowieso seit ein paar Jahren veraltet. Schau mal in die avr-libc-Doku. Da findest du auch die aktuellen Namen.
Hallo Simon, da du zu faul bist zu suchen: http://www.atmel.com/dyn/resources/prod_documents/doc8001.pdf Lesen mußt du aber selber ;) avr
Manchmal fragt man sich mit welcher Dokumentation die Leute überhaupt programmiert haben, wenn die nicht mal wissen, wo man ISR Handlernamen herbekommt ;)
So ich hab den nun Ausgetauscht und alles angepasst. USART und DOGM-LCD funzt denoch nicht.
1 | //Auf ATMega32 bestens funzend:
|
2 | void myuart_init(void) { |
3 | UBRRH = UBRR_VAL >> 8; |
4 | UBRRL = UBRR_VAL & 0xFF; |
5 | // Enable receiver and transmitter; enable RX interrupt
|
6 | UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE); |
7 | //asynchronous 8N1
|
8 | UCSRC = (1 << URSEL) | (3 << UCSZ0); |
9 | }
|
10 | |
11 | //Umgeschrieben fuer ATMega324p
|
12 | void myuart_init(void) { |
13 | UBRR0H = UBRR_VAL >> 8; |
14 | UBRR0L = UBRR_VAL & 0xFF; |
15 | // Enable receiver and transmitter; enable RX interrupt
|
16 | UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); |
17 | UCSR0C = (1<<USBS0)|(3<<UCSZ00); |
18 | }
|
19 | |
20 | |
21 | |
22 | void myuart_putc(unsigned char data) { |
23 | |
24 | while (!(UCSR0A & (1<<UDRE0))) |
25 | {
|
26 | }
|
27 | UDR0 = data; |
28 | }
|
29 | |
30 | void myuart_puts(const char *s) { |
31 | while (*s) |
32 | myuart_putc(*s++); |
33 | }
|
Simon schrieb: > USART und DOGM-LCD funzt denoch nicht. Glaskugel ist leider in der Reparatur -- also dann sag doch mal, was nicht funktioniert. > //asynchronous 8N1 > UCSRC = (1 << URSEL) | (3 << UCSZ0); Das kann man sich übrigens klemmen, 8N1 ist immer der Default bei allen AVRs. > UCSR0C = (1<<USBS0)|(3<<UCSZ00); ...und dann hast du es noch flacsh portiert, hier ist nämlich ein 8N2 draus geworden.
USBS0 weg lassen habe ich auch schon probiert, denoch kein Erfolg irgendwas muss am Atmega324p noch anders sein.
ich kann via rs232 an den yC zeichen schicken und er antwortet drauf, zwei mal. danach muss ich erstmal die spannung abschalten und wieder ein schalten um nochmal senden zu koennen.
1 | #define UART_BAUD_RATE 9600
|
2 | #define EXTERN
|
3 | #include "avr/io.h" |
4 | #include "util/delay.h" |
5 | #include <inttypes.h> |
6 | #include "avr/interrupt.h" |
7 | #include "myuart.h" |
8 | |
9 | int main(){ |
10 | myuart_init(); |
11 | sei(); |
12 | _delay_ms(10); |
13 | myuart_puts("HALLO"); |
14 | while( 1 ) { |
15 | }
|
16 | }
|
myuart.c
1 | #include <util/delay.h> |
2 | #include <stdlib.h> |
3 | #include <avr/interrupt.h> |
4 | #include <inttypes.h> |
5 | #include "myuart.h" |
6 | |
7 | volatile char uart_buffer[75]; |
8 | volatile char uart_buffer2[35]; |
9 | |
10 | #define BAUD 9600UL // Baudrate
|
11 | |
12 | // Berechnungen
|
13 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
14 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
15 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
16 | |
17 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
18 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
19 | #endif
|
20 | |
21 | ISR(USART0_RX_vect) { // USART RX interrupt |
22 | unsigned char c; |
23 | c = UDR0; |
24 | myuart_putc(c); |
25 | }
|
26 | |
27 | |
28 | void myuart_init(void) { |
29 | UBRR0H = UBRR_VAL >> 8; |
30 | UBRR0L = UBRR_VAL & 0xFF; |
31 | // Enable receiver and transmitter; enable RX interrupt
|
32 | UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); |
33 | //UCSR0C = (1<<USBS0)|(3<<UCSZ00);
|
34 | UCSR0C = (3<<UCSZ00); |
35 | |
36 | //asynchronous 8N1, alt funzend auf ATMega32
|
37 | //UCSR0C = (1 << URSEL) | (3 << UCSZ0);
|
38 | |
39 | }
|
40 | |
41 | void myuart_putc(unsigned char data) { |
42 | |
43 | while (!(UCSR0A & (1<<UDRE0))) |
44 | {
|
45 | }
|
46 | UDR0 = data; |
47 | }
|
48 | |
49 | void myuart_puts(const char *s) { |
50 | while (*s) |
51 | myuart_putc(*s++); |
52 | }
|
myuart.h
1 | void myuart_init(void); |
2 | void myuart_putc(unsigned char data); |
3 | void myuart_puts(const char *s); |
ich habs, der code ist CKDIV8 Fuse abgeschalten. und es funzt bestens, allerdings haette ich noch ne kleine Frage: Wieso wirkt CKDIV8 obwohl ich nicht den internen oscillator verwende?
Simon schrieb:
> Wieso wirkt CKDIV8 obwohl ich nicht den internen oscillator verwende?
Wieso denn nicht? Steht schließlich auch im Datenblatt...
Simon schrieb: > Wieso wirkt CKDIV8 obwohl ich nicht den internen oscillator verwende? Weil sie die Voreinstellung des clock prescalers (CLKPR) von 1:1 auf 1:8 ändert. Die neuen AVRs haben nur noch einen einzigen RC-Oszillator, der mit 8 MHz läuft, nicht mehr vier verschiedene wie früher, die man mit Fuses ausgewählt hat. Du kannst das auch ganz ohne Modifikation von CKDIV8 zur Laufzeit umschalten:
1 | #include <avr/power.h> |
2 | |
3 | ...
|
4 | clock_prescale_set(clock_div_1); |
oh, Danke. Also das LCD DOGM163 funzt immer noch nicht. Es ist alles gleich geblieben. selbes Display, die selben zwei Kondensatoren (3.3V) Genauso angeschlossen wie beim Atmega32. Selber source code. und denoch kein Erfolg Irgendwas muss am Mega324p anders sein
ATmega324p an EA-DOGM163W-A PC0-7 an D0-D7 PA0 (37) an RS (39) PA1 (36) an R/W (37) PA2 (35) an RES (40) PA3 (34) an E (36) Die Anschluesse sind die selben wie vorher beim ATmega32. Der source genauso. ich habe diesmal sicherheitshalber nur den UART benutzt und den original source der vorher funzte.
1 | // PORTC data
|
2 | #define CO_1 PORTA |= (1<<PA0)
|
3 | #define CO_0 PORTA &= ~(1<<PA0)
|
4 | |
5 | #define RW_1 PORTA |= (1<<PA1)
|
6 | #define RW_0 PORTA &= ~(1<<PA1)
|
7 | |
8 | #define RES_1 PORTA |= (1<<PA2)
|
9 | #define RES_0 PORTA &= ~(1<<PA2)
|
10 | |
11 | #define E_1 PORTA |= (1<<PA3)
|
12 | #define E_0 PORTA &= ~(1<<PA3)
|
13 | |
14 | #include "avr/io.h" |
15 | #include "util/delay.h" |
16 | #include "dogm.h" |
17 | |
18 | // BEFEHLE
|
19 | void setCommand( uint8_t data ){ |
20 | _delay_ms(10); |
21 | |
22 | DDRC = 0xff; // ausgang |
23 | PORTC = data; |
24 | |
25 | RW_0; |
26 | CO_0; |
27 | |
28 | E_1; |
29 | _delay_us(50); |
30 | E_0; |
31 | }
|
32 | |
33 | // DATEN
|
34 | void lcd_putc( uint8_t data ){ |
35 | _delay_ms(10); |
36 | DDRC = 0xff; // ausgang |
37 | PORTC = data; |
38 | RW_0; |
39 | CO_1; |
40 | E_1; |
41 | _delay_us(50); |
42 | E_0; |
43 | }
|
44 | |
45 | void lcd_init(){ |
46 | PORTA &= ~( (1 << PA0) | (1 << PA1) | (1 << PA2) | (1 << PA3) ); // Alle auf LOW |
47 | // als Ausgang
|
48 | DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3); |
49 | |
50 | PORTC = 0x00; |
51 | DDRC = 0xff; |
52 | |
53 | _delay_ms(100); |
54 | CO_0; |
55 | RW_0; |
56 | E_0; |
57 | RES_0; |
58 | _delay_ms(100); |
59 | RES_1; |
60 | _delay_ms(100); |
61 | // Grundinitialisierung
|
62 | setCommand(0x39); |
63 | setCommand(0x1D); // BS: 1/4, 2 Zeilen |
64 | // setCommand(0x50); // 52 Boster aus, Kontrast C5,C4 5Volt
|
65 | setCommand(0x55); |
66 | setCommand(0x6C); // 69 Spannungsfolger und Verstärkung |
67 | // setCommand(0x77); // Kontrast C3,C2,C1 bei 5V
|
68 | setCommand(0x7C); |
69 | setCommand(0x38); |
70 | setCommand(0x0F); // Display ein, Cursor ein, Cursor blinken |
71 | setCommand(0x06); // Autoincrement |
72 | setCommand(0x01); // display löschen |
73 | _delay_ms(250); |
74 | setCommand(0x80); // Kursorposition setzen |
75 | lcd_puts("."); |
76 | }
|
77 | |
78 | void lcd_goto_xy(uint8_t x, uint8_t y) { |
79 | int addr = 0x80; |
80 | if (y==1) addr = 0x90+x; |
81 | else if (y>1) addr = 0xA0+x; |
82 | _delay_ms(10); |
83 | PORTC = addr; |
84 | RW_0; |
85 | CO_0; |
86 | E_1; |
87 | _delay_us(50); |
88 | E_0; |
89 | |
90 | }
|
91 | |
92 | void lcd_clear(void) { |
93 | setCommand(0x01); |
94 | }
|
95 | |
96 | void lcd_puts(const char *s) { |
97 | while (*s) { |
98 | lcd_putc(*s); |
99 | s++; |
100 | }
|
101 | }
|
ja JTAGEN ist aus, also sprich die checkbox in AVRStudio nicht angeklickt. das musste ich beim ATMega32 auch tun.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.