Umstieg Atmega32 auf Atmega324P

Gast #1415256
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
#1415266
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.
Gast #1415391
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.
#1415396
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.
Gast #1423952
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
}
Moderator Persönliche Seite #1424338
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.
Gast #1425189
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);
Moderator Persönliche Seite #1425375
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);
Gast #1426148
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
Gast #1426384
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
}

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