Forum: Compiler & IDEs Umstieg Atmega32 auf Atmega324P


von Simon (Gast)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

oh man TIMSK gibts da auch nicht mehr

// Timer init OVF
TCNT1 = 0;
TCCR1B |= (1<<CS12)|(1<<CS10);
TIMSK |= (1<<TOIE1);

von (prx) A. K. (prx)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

oooh man, son rotz da is ne ganze Menge anders selbst das SIGNAL() fuer 
UART ist ein anderes

von STK500-Besitzer (Gast)


Lesenswert?

>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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

aber irgendwie muss sich das doch rausfinden lassen.
z.B.
wie das SIGNAL heiszt unsw..

von (prx) A. K. (prx)


Lesenswert?

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.

von Uwe .. (uwegw)


Lesenswert?

SIGNAL ist sowieso seit ein paar Jahren veraltet. Schau mal in die 
avr-libc-Doku. Da findest du auch die aktuellen Namen.

von avr (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Manchmal fragt man sich mit welcher Dokumentation die Leute überhaupt 
programmiert haben, wenn die nicht mal wissen, wo man ISR Handlernamen 
herbekommt ;)

von Simon (Gast)


Lesenswert?

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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

USBS0 weg lassen habe ich auch schon probiert, denoch kein Erfolg
irgendwas muss am Atmega324p noch anders sein.

von Simon (Gast)


Lesenswert?

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);

von Simon (Gast)


Lesenswert?

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?

von Justus S. (jussa)


Lesenswert?

Simon schrieb:

> Wieso wirkt CKDIV8 obwohl ich nicht den internen oscillator verwende?

Wieso denn nicht? Steht schließlich auch im Datenblatt...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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);

von Simon (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Woran ist es denn angeschlossen?

von Simon (Gast)


Lesenswert?

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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

JTAGEN hast du abgeschaltet?

von Simon (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.