Forum: Mikrocontroller und Digitale Elektronik mega32 unterschiedliche Portpegel trotz "gleicher" Initialisierung


von Cyrill J. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich interessiere mich viel für µC's, sodass ich in meiner Freizeit immer 
etwas an den Dinger rumbastle. - An dieser Stelle ist diese Seite/Forum 
phantastisch. - Angefangen mit nem mega8, jetzt mit einem mega32 auf dem 
Pollin-Board. Geproggd wird über einen selbstgebauten 
Parallelport-Programmer mit Hilfe von PonyProg. Entwicklungsumgebung ist 
Eclipse.

Erste Erfahrung mit dem Programmieren von µC's sammlte ich in Assembler 
und versuche mich jetzt in C.
Kenntnisse in Jave, C und C++ sind vorhanden, auch wenns nur die 
Grundlagen sind :)

Zur meinem Problem:
Habe hier eine ganz billige Schaltung: 4-digits 7Segment-Anzeige auf nem 
Board geteckt und bin dabei diese mit dem mega32 anzusteuern, folgendes 
Phänomen ist mir aufgefallen:

Um mir die Arbeit zu sparen, was die Initialisierung der Ports angeht, 
dachte ich an eine kurze und knappe void-funktion: void initPorts(void), 
die entsprechend die Bits in DDRA und DDRC setzen soll, ich also im 
weiteren Verlauf des Hauptprogramms nur noch die PORTx-Zustände ändern 
kann.

WENN ich mit dieser Technik arbeite, und in der main anweise: PORTA = 
0xff;
liegt am PIN4 ein Pegel von 2,55V an, die Restlichen bei um 4,8V

Ändere ich jetzt die Initialisierung dahingehend, dass ich auf die 
initPorts()-Funktion verzichte, und die Initialisierung unmittelbar vor 
der Hauptfunktion setze, dann habe ich auch am PIN4 (PortA) ein Pegel 
von annährend 5V, sprich die LED leuchtet.

Meine Frage jetzt, kann es sein, dass der Compiler da was durcheinander 
bringt ?
Wie können überhaupt 2,55V an einem PIN anliegen ?

Ich hänge entsprechend die Datei mit an, es handelt sich hauptsächlich 
um die Zeilen 43,44 bzw. 64. (Ich weiss, kein toller Code, aber ich 
denke nachzuvollziehen)

Ich kann auch mit einer "direkten" Initialisierung arbeiten, nur wissen 
würde ich es schon gerne, warum sowas auftritt.

Für Eure Hilfe und Zeit danke ich schon mal im Voraus
Gruß
Cyrill

von Sven K. (svenk)


Lesenswert?

So wie ich das sehe, müsste er beim weiteren compilieren Fehler 
ausspucken.
Versuche mal die Funktionen alle ÜBER!!! der main Funktion zu schreiben.
So müsste er eigentlich beim linken meckern das er die Funtion nicht 
findet.

Gruß Sven

von Tishima (Gast)


Lesenswert?

Hallo!

Fehler beim ATMEGA32 an PORTC, wenn da mal nicht JTAG am Proezessor 
eingeschaltet ist !?

gruß,
Bjoern

von Cyrill J. (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Bin deinem Rat gefolgt und die Funktionen über der main gesetzt, die 
Prototypen auskommentiert und leider der selbe Effekt, PIN4 2,55V und 
keine Fehler- noch Warningausgabe beim Compilieren.

von Andreas K. (a-k)


Lesenswert?

Vorwiderstände für die LEDs vergessen? Schaltbild wäre nützlich.

von Cyrill J. (Gast)


Lesenswert?

Hmm, jetzt wirds interessant,

ja, JTAG war gesetzt, jetzt rausgenommen und das Problem bleibt 
bestehen.
Vorwiderstände sind auch da, die digits selbst werden über ein BC548B 
angestuert. -> Pins sind mir an dieser Stelle wichtig :)

wie gesagt, werden die Zeilen 43/44 quasi getoggelt, liegt an PIN4 
entsprechend 2,55V bzw. 5V an. Einmal sichtbar, über die LED, 
anderesseits gemessen. Daraus schließe ich, das der PORT bzw. der PIN in 
Ordnung ist, was, nebenbei, mein erster Gedanke war, dass sich den Port 
zerschossen habe.

von Sven K. (svenk)


Lesenswert?

Du hattest ja schon code laufen, kannst Du mal bitte den Code der 
funtioniert und dann den der nicht funtioniert bitte zeigen.

1. main_running.c / 2. main_failed.c in eine zip-Datei.

Dann kann man das noch besser überprüfen.
Und hast Du einen Schaltplan ?

Gruß Sven

von Cyrill J. (Gast)


Angehängte Dateien:

Lesenswert?

Hab das jetzt nochmal auf das Wesentliche gekuerzt, um den Unterschied 
zu sehen, habe sogar 2 neue Projekte erstellt und das Verhalten 
reproduziert.
Im Anhang sind die 2 main-Dateien, die den Effekt erzeugen.
Schaltplan habe ich nicht gemacht, da ich alles direkt auf dem 
Steckbrett aufgebaut habe. Allerdings kann ich Fehler dort ausschließen, 
da ungeändert dessen, wird die MCU entsprechend den angefügten Files 
geflasht mit dem erwähnten Effekt.

Jedoch, die Schaltung entspricht diesem hier: 
http://www.klaus-leidinger.de/mp/Mikrocontroller/7Segment/7Segment.html#oben

mit dem Unterschied, dass ich digits mit gemeinsamer Kathode habe.
PortC stuert die digits, PortA die Segmente.

von Cyrill J. (Gast)


Lesenswert?

Ahso, eins noch:

Zum Thema JTAGn, das Bit: JTAGEN in PonyProg habe ich wieder gesetzt(wie 
es war), da sonst in beiden Fällen die LED nicht leuchtet.

Meine, das die FuseBit-Geschickte auch irgendwie invertiert ist, doer ? 
sprich 1 -> Deaktiviert, 0 -> aktiviert ?!

von gast (Gast)


Lesenswert?

>>Geproggd wird über einen selbstgebauten
>>Parallelport-Programmer mit Hilfe von PonyProg.

beim pollin board ist doch ein prorammer mit dabei, aber naja^^

von Sven K. (svenk)


Lesenswert?

#include <avr/io.h>
#include <avr/interrupt.h>

void initPorts(void)
{
  DDRA = 0xff;
  DDRC |= (1<<DDC0);
}

int main(int argc, char **argv)
{
  initPorts();
  //DDRA = 0xff;
  //DDRC = 0x01;
  while (1)
  {
    PORTC = 0x01;
    PORTA = 0xff;
  }
}

Probiere mal diesen Code.
Das muss jetzt identisch zu dem main_running sein....

Gruß Sven

von Cyrill J. (Gast)


Lesenswert?

Ja, das geht, in der Tat,
jedoch bin ich grad auf Sprung und kann mich erst später um die 
eigentliche Arbeit der MCU kümmern.
Danke schon ma im Voraus, d.h. dass der Linker nicht richtig linkt ?
Werd mir dann angewöhnen müssen alles vor die main zu schreiben.

@Gast, ja Pollin hat auch einen Programmer onBoard, jedoch seriel und 
ich kann keine 2secs länger beim progn warten :) - ausserdem bin ich zu 
faul jedesmal zwischen ISP und UART zu switschen.

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.