Forum: Mikrocontroller und Digitale Elektronik io.h falsch?


von mil (Gast)


Lesenswert?

hallo zusammen

ich bin gerade an den ersten schritten mit avr studio 4 und gcc.
als beispiel möchte ich folgenden code testen :

#include <avr/io.h>
#include <util/delay.h>


int main(void)
{

  /* Setzt das Richtungsregister des Ports A auf 0xff
       (alle Pins als Ausgang): */
  DDRA = 0xff;

  /* Setzt PortA auf 0x00, alle "low": */
    PORTA = 0x00;

  while (1)
  {

  PORTA |= (1 << 2);    /* setzt Bit 2 an PortA */
  _delay_ms(1000);
  PORTA &= ~(1 << 2);   /* loescht Bit 2 an PortA */
  _delay_ms(1000);
  }
}


allerdings erhalte ich immer build-errors :

../test-gcc.c:10: error: `DDRA' undeclared (first use in this
function)
../test-gcc.c:10: error: (Each undeclared identifier is reported only
once
../test-gcc.c:10: error: for each function it appears in.)
../test-gcc.c:13: error: `PORTA' undeclared (first use in this
function)


laut avr-gcc-tutorial ist die io.h einzubinden, da darin DDRA definiert
werde. das ist aber nicht der fall.. ? mit der iom48.h geht es auch
nicht...
kann mir jemand weiter helfen. vielen dank

von Peter (Gast)


Lesenswert?

Evtl hat der µC kein DDRA, PORTA bzw PINA??

kommen sonnst noch warnings?

von mil (Gast)


Lesenswert?

ups, vergessen : habe einen atmega48 definiert

von Peter (Gast)


Lesenswert?

LOL
eine frage, wie kommst du auf PORTA??

Hast du eine Funkverbindung zum PORTA des M48??

von mil (Gast)


Lesenswert?

ja, genau das wars !

mit DDRD und PORTD geht es natürlich..

vielen dank

von Peter (Gast)


Lesenswert?

Eine frage, funktioniert dein kopf???
Wie kommst du eigendlich auf PORTA?

von Jojo S. (Gast)


Lesenswert?

und das nächste Problem wird vermutlich das '_delay_ms(1000);' So eine
lange Zeit kriegst du nur bei sehr langsamen Takt hin. Die maximale Zeit
ist abhänging vom CPU Takt weil nur einfache Warteschleife geflogen
wird, gucke mal in die Doku oder das Headerfile, da steht die Formel
für die Berechnung drin.

von mil (Gast)


Lesenswert?

Peter : kopf funktioniert, wieso?
porta habe ich aus dem avr-gcc-tutorial...

johannes: danke für den hinweis.
The maximal possible delay is 262.14 ms / F_CPU in MHz.

heisst das 262ms / 10 bei 10 Mhz?

wie wird ein einsekunden delay realisiert generell? mit verschachtelten
schleifen?

danke

von johnny.m (Gast)


Lesenswert?

> heisst das 262ms / 10 bei 10 Mhz?
Genau, also 26,212 ms max.

> wie wird ein einsekunden delay realisiert...
Einsekunden-Delays macht man einfach nicht! Wenn Du wirklich ne Sekunde
warten musst, dann aktivier nen Timer, schick den µC schlafen und lass
ihn von nem Timer-Interrupt wieder aufwecken. Wenn Du es aber UNBEDINGT
mit Zeitschleifen willst, kannste die natürlich beliebig
verschachteln...

von Jojo S. (Gast)


Lesenswert?

um für den ersten Versuch eine LED im Sekundentakt blinken zu sehen ist
eine einfache Zeitschleife aber ok, das mit Interrupts zu erledigen
wäre vielleicht Übung Nr.2. Also einfach z.B. 50x20ms warten.

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.