AT90USBKey2 (1287) tut nicht was er soll. Polung?

Gast #3130877
Lesenswert?

Hallo zusammen, ich bin am verzewifeln.
Für den AT90USBKey2 habe ich mir eine Adapterplatine gemacht, damit mal 
die Ports des µC auch anständig nutzen kann. Ich selber bin ziemlicher 
Neuling auf dem ganzen Gebiet. Und habe nun folgedes Problem:

Zum Test ob alle Pins ordnungsgemäß funktionieren habe ich zunächst ein 
kleines Lauflicht-Programm geschrieben. Es ist kein guter 
Programmierstil, aber es sollte auch nur zu Testzwecken sein.
[c]#define F_CPU 8000000

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

void watchdog_off() {
  MCUSR &= ~(1<<WDRF);       //Ack_wdt_reset();
  WDTCSR |= (1<<WDCE) | (1<<WDE); //Wdt_change_enable();
  WDTCSR = 0x00;           //Wdt_stop();
}

void Init(void){
  // Alle Pins als Ausgang schalten
  DDRB = 0xFF;

}
int main(void)
{

  watchdog_off();
  Init();

  while(1)
  {
    //Alle Pins 5V ausgeben
    PORTB = 0x01;
    _delay_ms(100);
    PORTB = 0x02;
    _delay_ms(100);
    PORTB = 0x04;
    _delay_ms(100);
    PORTB = 0x08;
    _delay_ms(100);
    PORTB = 0x10;
    _delay_ms(100);
    PORTB = 0x20;
    _delay_ms(100);
    PORTB = 0x40;
    _delay_ms(100);
    PORTB = 0x80;
    _delay_ms(100);

  }  // while (1)

} // main[\c]

Leider tut sich an Port B aber 'null' (an den anderen Ports auch nicht). 
Da ich mir bei dem Programm nicht sicher war, habe ich anschließend 
versucht Spannung auf allen Pins auszugeben. Ergebnis ist entsprechend, 
die LEDs bleiben dunkel. Angeschlossen sind sie jeweils vom Pin zu 
Masse/GND, wobei das kurze Bein jeweils an GND liegt.

[c]int main(void)
{

  watchdog_off();
  Init();

  while(1)
  {
    //Alle Pins 5V ausgeben
    PORTB = 0xFF;

  }  // while (1)

} // main[\]

Mit einem Durchgangsprüfer habe ich zunächst getestet ob ich beim löten 
Mist gebaut habe, aber da hat alles einen richtigen Eindruck gemacht.
Zum Schluss bin ich hingegangen und habe einfach mal eine LED 
andersherum angeschlossen, von Vcc zum PortPin tut sich was. Was läuft 
fa schief?

DDRX = 0b00001111 sollte doch die oberen vier auf Eingang setzen und die 
unteren auf Ausgang. In meinem Programm demnach alle auf Ausgang. Mit 
PORTX = 0b00001111 sollten doch die oberen vier 0V führen und die 
unteren vier ~5V ausgeben. In meinem Programm demnach alle 5V ausgeben.
Habe ich hier etwas falsch verstanden?

Ich hoffe jemand kann mir erklären was ich falsch mache.
Gruß
T. St.
#3130902
Lesenswert?

T.St. schrieb:
> [c]#define F_CPU 8000000
Bitte im Make-File bzw. Projekt definieren.

> void watchdog_off() {
>   MCUSR &= ~(1<<WDRF);       //Ack_wdt_reset();
>   WDTCSR |= (1<<WDCE) | (1<<WDE); //Wdt_change_enable();
>   WDTCSR = 0x00;           //Wdt_stop();
> }
Wieso verwendest du nicht die Watchdog-Funktionen von  AVR-GCC (wdt.h)?
>
> void Init(void){
>   // Alle Pins als Ausgang schalten
>   DDRB = 0xFF;
>
> }
> int main(void)
> {
>
>   watchdog_off();
>   Init();
>
>   while(1)
>   {
>     //Alle Pins 5V ausgeben
>     PORTB = 0x01;
>     _delay_ms(100);
>     PORTB = 0x02;
Hast du die Compiler-Optimierungen an (mindestens -O1) sonst geht das 
_delay_ms nicht richtig
Gast #3130925
Lesenswert?

So, das einfachste Programm überhaupt habe ich nun getestet. Leider 
immer noch die selbe Sympthomatik. Ich überspiele das Programm 
(hex-File) mit Flipp falls das eine Rolle spielt.
Devive verbinden (Open), Hex-Datei auswählen und dann die vier Haken 
links und "Run", anschließend gehe ich auf Start Application mit Reset.

Ich verstehe nicht, warum die Port Pins keine Spannung ausgeben...

Gruß

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