PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : programm funktioniert nicht mehr?



manu_f
04.11.2006, 17:23
schönen guten abend zusammen!

also ich hab jetzt mal mein erstes C-Programm für den Atmega32 (rn-control) geschrieben. habe das programm kompiliert und mit pony auf den MC geflasht. na kurzem hin und her hat es dann funktioniert.
nur leider gehts jetzt nicht mehr... :(



#include <avr/io.h>

int main(void)
{
int i;
DDRC = 0xff; // PORTC als Ausgang
DDRA = 0x00; // PORTA als Eingang
while (1)

{
i=PINA;
if(i == 0x01)
{
PORTC = 0x00;
}
else
{
PORTC = 0xff;
}

}
}


im simulator funktioniert noch alles, nur wenn ich an PIN0 von PORTA 5V anlege passiert nichts mehr...
an was könnte das liegen?

gruß manu

robocat
04.11.2006, 17:33
an deinem code seh ich keinen fehler, und du sagst ja auch es hat schon geklappt.
mein einer atmega hat häufig sein programm "verloren" wenn der ISP zu lange dranhing. also vielleicht einfach noch mal flashen?

izaseba
04.11.2006, 17:36
Hmm, vielleich undefinierte Pegel am Port A ?

versuch mal entweder einen Pulldown Widerstand anzuschliessen, oder mit PORTA = 0xFF;
interne Pullups einzuschalten und gegen GND zu schalten...

Gruß Sebastian

manu_f
04.11.2006, 17:50
erst mal danke für eure antworten!
hat leider beides nicht funktioniert.
@izaseba
ich hab das rn-control, wenn ich dann die pullups einschalte müsste ich doch die leds auslöten und drehen :?

kann ich irgendwie einen funktionstest vom mc machen? nicht das ich den irgendwie geschrottet habe und merks nicht...


greetz manu

izaseba
04.11.2006, 18:02
ich hab das rn-control, wenn ich dann die pullups einschalte müsste ich doch die leds auslöten und drehen

Was haben jetzt LED's mit Pullup an einem Taster zu tun ?
RN-Controll, ist es nicht das Teil mit Dem Widerstandsnetzwerk an den Tastern ?

Am sonsten wüßte ich auch nicht mehr, wo der Fehler liegt.

Gruß Sebastian

robocat
04.11.2006, 18:07
du kannst mal messen ob versorgungsspannung stimmt (tut sie aber, sonst liesse sich der µC nicht beschreiben).
du kannst schauen, ob am reset 5V anliegen.
ich kenn das rn-control nicht so gut, aber wenn dort an portA leds (von +5V mit vorwiderstand kommend) sind, sollte das nichts machen @pullups. dann leuchten sie eben nicht.
du kannst dein programm mal vereinfachen, so dass portC immer high ist. dann sollten deine leds dort doch leuchten, oder? (ich guck dann gleich mal wie das rn-control aufgebaut ist..)

gruesse

manu_f
04.11.2006, 18:24
also die spannungen sind alle da, auch am reset (4,89V).
wenn ich das programm so ändere leuchten halt die leds dauerhaft und lassen sich nicht ausschalten!



int main(void)
{
int i;
DDRC = 0xff; // PORTC als Ausgang
DDRA = 0x00; // PORTA als Eingang

while (1)

{
i=PINA;
if(i == 0x80)
{
PORTC = 0xff;
}
else
{
PORTC = 0x00;
}

}
}


ich weiß nicht, kenn mich noch nicht so gut aus, könnte es eventl auch an den lock- und fusebits liegen? hab an denen noch nichts herumgestellt!

gruß manu

izaseba
04.11.2006, 18:35
Es stellt sich die Frage, ob Du weißt was


if ( i = 0x80)

bedeutet.
Das ist Käse, weil diese Bedienung ist nur dann erfüllt, wenn PA7 High und alle anderen Pins Lows sind.
Besser wäre z.B.



if ( i & (1<<PA7) )

zu schreiben, hier Prüfst Du nur Pin 7 ab, der Rest ist egal.

Aber Bleib mal bei Deinem Pin0 und versuche es mal so :


#include <avr/io.h>

int main(void)
{
int i;
DDRC = 0xff; // PORTC als Ausgang
DDRA = 0x00; // PORTA als Eingang
PORTA = (1<<PA0);
while (1)

{
i=PINA;
if(i & (1<<PA0))
{
PORTC = 0x00;
}
else
{
PORTC = 0xff;
}

}
}


und dann hälst Du Pin0 vom PortA mal an 5V und mal an GND.

Schauen wir mal was Passiert.

Gruß Sebastian

manu_f
04.11.2006, 18:47
huhu!
respekt, so gehts! wenn ich dein programm nehme und PA0 auf masse lege gehn die leds aus :)
kannst du mir bitte noch mal ein link oder ne erklärung zu posten? :
PORTA = (1<<PA0); und i & (1<<PA0)

was mich noch wundert ist das es dann überhaupt schon mal ging...

vielen dank, gruß
manu

izaseba
04.11.2006, 19:05
respekt, so gehts!

Naja, sehe Post Nr 1.

Link ? Hier (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial)
ist ein guter Tutorial, aber C Kentnisse sind denk ich mal eine Voraussetzung.

Erklärung ?
PORTA = (1<<PA0);

Schaltet den internen Pullup ein, wenn der Port als Eingang definiert wurde.

PA0 ist halt Pin0 am Port A und << soll halt in C bitschieben darstellen.

i & (1<<PA0)

& eine UND Verknüpfung ( wieder C )

z.B. Zustand von i binär 01001111
(1<<PA0) ergibt 00000001

Und Verknüpfung :
01001111
00000001
-----------
00000001

womit man bei 1 landet, 1 in einer if Abfrage ergibt true -> Schleife läuft durch.

Gruß Sebastian

P.S.



wenn ich dein programm nehme

Es ist nicht mein sondern Dein Programm mit 2 Modifikationen :-)

manu_f
05.11.2006, 09:05
oke danke!

greetz manu