Forum: Compiler & IDEs AVR ATMEGA644 IOs


von Zork (Gast)


Lesenswert?

Hallo zusammen

Suuuper Forum, Gratulation!

Als Ersatz für eine Steuerung entschied ich mich für einen ATmega644.
Die HW ist folgendermassen aufgebaut: Inputs von 24VDC über Optokoppler 
auf uC mit 5VDC, Outputs über High Side Switches (schalten auch 24VDC). 
Eingänge mit Pull-Down Widerständen.
HW wurde getestet, sollte keine Fehler aufweisen.
Als Compiler verwende ich AVR Studio 4.0, welcher mir von div. Seiten 
empfohlen wurde.
In Sachen C-Programmierung bin ich ein blutiger Anfänger aber leider 
bringe ich nicht einmal die einfache Ansteuerung der IOs zustande. Habe 
mir auch das Skript dieser Homepage zu Hilfe genommen...
Kann mir bitte jemand auf die Sprünge helfen, wie der Code lauten muss 
um z.B. I portc pin0 ==> O porta pin0, I portc pin1 ==> O porta pin1...
Habe viele Dinge ausprobiert und bin mittlerweilen frustriert und kurz 
vor der Resignation.

P.S. nicht böse werden über meine Unerfahrenheit ;-)

Danke im Voraus

von Mark .. (mork)


Lesenswert?


von Gerd G. (elektrikser)


Lesenswert?

Zeige mal, was du probiert hast.
DDRC und DDRA richtig gesetzt?
JTAG-Fuse gelöscht (Du verwendest PortC. Bei Auslieferung des Atmegas 
ist JTAG gesetzt und blockiert dir vier Pins von C)?

von Zork (Gast)


Lesenswert?

Probiert habe ich so Vieles.
Diverse Dinge aus anderen Posts.
Was für mich nach Datenblatt und dem AVR-GCC-Tutorial das Naheliegendste 
war:

#include <avr/io.h>

void mainLoop()
{
    //main loop
}

void portTest()
{
  DDRA = 0xff;    //port a bit 0 to 7 as output
  DDRC = 0x00;    //port c as input

  for(;;)      //output active if...
  {
     PORTA = PINC;  //checking condition from input and set output
  }

}

int main()
{
  portTest();
  mainLoop();  //never return
}

Aber das JTAG... Das könnte was sein. Wie müsste das im Code 
implementiert sein?

THX for the help

von Gerd G. (elektrikser)


Angehängte Dateien:

Lesenswert?

Nicht im Code. Du programmierst die Fuses im AVRStudio unter Tools -> 
Program AVR... Ist in einem Karteireiter versteckt. In dem Bild ist JTAG 
deaktiviert.

von Peter D. (peda)


Lesenswert?

Gerd G. wrote:
> Nicht im Code.

Und warum nicht?
1
MCUCR = 1<< JTD;
2
MCUCR = 1<< JTD;

Peter

von Gerd G. (elektrikser)


Lesenswert?

Ach ja, zu deinem Programm:
1
void portTest()
2
{
3
  DDRA = 0xff;    //port a bit 0 to 7 as output
4
  DDRC = 0x00;    //port c as input
5
6
  for(;;)      //output active if...
7
  {
8
     PORTA = PINC;  //checking condition from input and set output
9
  }
10
11
}

for(;;){} ist eine Endlosschleife und wäre besser in der main() 
aufgehoben. Gehört nicht in eine Funktion, weil du da nicht mehr 
rauskommst. Beim Hauptprogramm ist das aber erwünscht.
Mit PORTA = PORTC; kopierst du  A auf C und negierst nicht. Du solltest 
vielleicht noch bei den Ausgängen die Pullup-Widerstände setzen.

@ Peter
Ja, ich weiß, dass das geht. Man kann es auch im Makefile machen. Ich 
wollte es einfach halten. Obwohl, das wäre es ja auch...

Gruß Gerd

von Zork (Gast)


Lesenswert?

Wer suchet, der findet!!

War definitiv die JTAG Sache.

Absolut cool, jetzt macht die Sache wieder Freude.

Muss man zuerst mal drauf kommen so als Laie...


@ Gerd: würde dir jetz gerne ein Bier spendieren ;-) Vielen Dank für 
deine Hilfe

@ Mark: danke auch dir für deinen Input

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.