Forum: Mikrocontroller und Digitale Elektronik AT90USBKey2 (1287) tut nicht was er soll. Polung?


von T.St. (Gast)


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.

von Steven (. (ovular) Benutzerseite


Lesenswert?

Nimm mal einfach das einfachste Programm überhaupt:
1
int main(void){
2
   DDRB = 0xFF;
3
   PORTB = 0xFF;
4
   while(1);
5
}

Wie programmierst Du? kommen auch keine Fehlermeldungen? Programmierst 
Du die richtige .elf- oder .hex-File ?

Gruß
Steven

von Timmo H. (masterfx)


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

von T.St. (Gast)


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ß

von Steven (. (ovular) Benutzerseite


Lesenswert?

Jedenfalls fehlt dem Programm nichts.

Entweder es liegt zwischen Programmiervorgang und µC
oder ist an der Hardware was faul.
Reset Pin auf low, geringe Versorungsspannung, LEDs zerschossen...

Was auch immer. Wer suchet der findet...

Gruß
Steven

von Karlheinz (Gast)


Lesenswert?

T.St. schrieb:
> die LEDs bleiben dunkel. Angeschlossen sind sie jeweils vom Pin zu
> Masse/GND, wobei das kurze Bein jeweils an GND liegt

ohne Widerstand zur Strombegrenzung ???

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.