www.mikrocontroller.net

Forum: Compiler & IDEs Umstieg Atmega32 auf Atmega324P


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh man TIMSK gibts da auch nicht mehr

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon (Gast)
Datum:

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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber irgendwie muss sich das doch rausfinden lassen.
z.B.
wie das SIGNAL heiszt unsw..

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe ... (uwegw)
Datum:

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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Simon,

da du zu faul bist zu suchen:

http://www.atmel.com/dyn/resources/prod_documents/...

Lesen mußt du aber selber ;)

avr

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich hab den nun Ausgetauscht und alles angepasst.

USART und DOGM-LCD funzt denoch nicht.

//Auf ATMega32 bestens funzend:
void myuart_init(void) {
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
  // Enable receiver and transmitter; enable RX interrupt
  UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
  //asynchronous 8N1
  UCSRC = (1 << URSEL) | (3 << UCSZ0);
}

//Umgeschrieben fuer ATMega324p
void myuart_init(void) {
  UBRR0H = UBRR_VAL >> 8;
  UBRR0L = UBRR_VAL & 0xFF;
  // Enable receiver and transmitter; enable RX interrupt
  UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}



void myuart_putc(unsigned char data) {

while (!(UCSR0A & (1<<UDRE0)))
    {
    }
    UDR0 = data;         
}

void myuart_puts(const char *s) {
    while (*s) 
      myuart_putc(*s++);
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon (Gast)
Datum:

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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define UART_BAUD_RATE 9600
#define EXTERN
#include "avr/io.h"
#include "util/delay.h"
#include <inttypes.h>
#include "avr/interrupt.h"
#include "myuart.h"

int main(){
  myuart_init();
  sei();
  _delay_ms(10);
  myuart_puts("HALLO");
  while( 1 ) { 
  }
}


myuart.c
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include "myuart.h"

volatile char uart_buffer[75];
volatile char uart_buffer2[35];

#define BAUD 9600UL          // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif

ISR(USART0_RX_vect) { // USART RX interrupt
  unsigned char c;
  c = UDR0;
  myuart_putc(c);
}


void myuart_init(void) {
  UBRR0H = UBRR_VAL >> 8;
  UBRR0L = UBRR_VAL & 0xFF;
  // Enable receiver and transmitter; enable RX interrupt
  UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
  //UCSR0C = (1<<USBS0)|(3<<UCSZ00);
  UCSR0C = (3<<UCSZ00);

  //asynchronous 8N1, alt funzend auf ATMega32
  //UCSR0C = (1 << URSEL) | (3 << UCSZ0);

}

void myuart_putc(unsigned char data) {

while (!(UCSR0A & (1<<UDRE0)))
    {
    }
    UDR0 = data;         
}

void myuart_puts(const char *s) {
    while (*s) 
      myuart_putc(*s++);
}

myuart.h
void myuart_init(void);
void myuart_putc(unsigned char data);
void myuart_puts(const char *s);

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:

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

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/power.h>

...
   clock_prescale_set(clock_div_1);

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran ist es denn angeschlossen?

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
// PORTC data
#define CO_1 PORTA |= (1<<PA0)
#define CO_0 PORTA &= ~(1<<PA0)

#define RW_1 PORTA |= (1<<PA1)
#define RW_0 PORTA &= ~(1<<PA1)

#define RES_1 PORTA |= (1<<PA2)
#define RES_0 PORTA &= ~(1<<PA2)

#define E_1 PORTA |= (1<<PA3)
#define E_0 PORTA &= ~(1<<PA3)

#include "avr/io.h"
#include "util/delay.h"
#include "dogm.h"

// BEFEHLE
void setCommand( uint8_t data ){
  _delay_ms(10);
  
  DDRC = 0xff; // ausgang
  PORTC = data;
  
  RW_0;
  CO_0;

  E_1;
  _delay_us(50);
  E_0;
}

// DATEN
void lcd_putc( uint8_t data ){
  _delay_ms(10);
  DDRC = 0xff; // ausgang
  PORTC = data;
  RW_0;
  CO_1;  
  E_1;
  _delay_us(50);
  E_0;
}

void lcd_init(){
  PORTA &= ~( (1 << PA0) | (1 << PA1) | (1 << PA2) | (1 << PA3) ); // Alle auf LOW
  // als Ausgang
  DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3);
  
  PORTC = 0x00;
  DDRC = 0xff;

        _delay_ms(100);
  CO_0;
  RW_0;
  E_0;
  RES_0;
  _delay_ms(100);
  RES_1;
  _delay_ms(100);
// Grundinitialisierung
  setCommand(0x39); 
  setCommand(0x1D);               // BS: 1/4, 2 Zeilen
//  setCommand(0x50);               // 52 Boster aus, Kontrast C5,C4 5Volt
  setCommand(0x55);
  setCommand(0x6C);               // 69 Spannungsfolger und Verstärkung
//  setCommand(0x77);               // Kontrast C3,C2,C1 bei 5V
  setCommand(0x7C);
  setCommand(0x38);
  setCommand(0x0F);               // Display ein, Cursor ein, Cursor blinken
  setCommand(0x06);               // Autoincrement
  setCommand(0x01); // display löschen
  _delay_ms(250);
  setCommand(0x80);        // Kursorposition setzen
  lcd_puts(".");
}

void lcd_goto_xy(uint8_t x, uint8_t y) {
  int addr = 0x80;
  if (y==1) addr = 0x90+x;
    else if (y>1) addr = 0xA0+x;
    _delay_ms(10);
    PORTC = addr;
  RW_0;
  CO_0;
  E_1;
  _delay_us(50);
  E_0;
    
}

void lcd_clear(void) {
  setCommand(0x01);
}

void lcd_puts(const char *s) {
  while (*s) {
    lcd_putc(*s);
    s++;
  }
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAGEN hast du abgeschaltet?

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja JTAGEN ist aus, also sprich die checkbox in AVRStudio nicht 
angeklickt.
das musste ich beim ATMega32 auch tun.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.