Atmega32 - PortPin geht nicht auf High wenn Pullup gesetzt

OP (Firma: Chipwerkstatt) #7857531

Hallo Forengemeine, kämpfe etwas mit meinem Programm. Es geht mir der PC7 nicht auf High, trotz gesetzten Pullup. Setze ich in den Fuses das Häckelchen bei JTAG, dann geht hier zumindst der Pin auf High. Entferne ich ich das Häckelchen, um die JTAG-Schnittstelle zu deaktivieren, geht der PC5 wieder auf Lo (0).

Setze ich nun den Pullup, geht krzfristig der Pin auf High, dann aber ist er Lo. Es ist nur das Messgerät auf dem Pin.

Was ist falsch? oder habe ich den Pin geschossen? Mein Code-Schnippsel:

1
void initial(void)
2
 {    
3
    // **** Einrichten von Ein- und Ausgängen *************** 
4
    DDRA = 0xff;    // PortA Ausgänge
5
    DDRB = 0xd8;    // PortB Ausgänge 
6
 //   DDRC = 0xdf;    // PortC Ausgänge - Bit 5 Eingang - Chip Quitierung
7
    DDRC = 0b11011111;    // PortC Ausgänge - Bit 5 Eingang - Chip Quitierung
8
    DDRD = 0xff;    // PortD Ausgänge 
9

10
    //PORTB = (1<<PB7)|(1<<PB5)|(1<<PB4)|(1<<PB2)|(1<<PB1)|(1<<PB0); // Pull Up an PB0, PB1, PB2 am PortB aktiv
11
    // PullUps für die Eingänge aktivieren
12
   PORTB |= (1<<PB0);  // Pull Up an Pin0 -  aktivieren
13
  PORTB |= (1<<PB1);  // Pull Up an Pin1 -  aktivieren
14
  PORTB |= (1<<PB2);  // Pull Up an Pin2 -  aktivieren
15
  PORTB |= (1<<PB4);  // Pull Up an Pin5 - Starttaste Eingang aktivieren
16
  PORTB |= (1<<PB5);  // Pull Up an Pin3 - Goal- Eingang aktivieren
17
  PORTB |= (1<<PB7);  // Pull Up an Pin7 - Service-Taste aktivieren
18

19
  PORTC |= (1<<PC5);  // Pull Up an Pin27 - Chip Request aktivieren
20
  
21
     // **** Einrichten von Timer 1 ***************
OP (Firma: Chipwerkstatt) #7857540

Matthias S. schrieb:

Zumindest in dem Programmschnipsel wird an Port C überhaupt kein Pullup gesetzt.

Wieso? PORTC |= (1<<PC5); // Pull Up an Pin27 - Chip Request aktivieren

Matthias S. schrieb:

Und wenn du PC7 als Ausgang konfigurierst, wie im Programm gemacht,

Naja weil PC7 ein Ausgang ist, aber PC5 ein Eingang sein soll. Das müsste doch das Direction-Register machen, wie oben gesetzt.

Was mach ich falsch. Alles andere funktioniert soweit ja schon. Und der ganze Code ist auch bereits entsprechend komplex.

Gast #7857552

Thomas S. schrieb:

Ändert aber noch nichts am PC5 Problem - Kein High

Vermutlich gibt es noch mehr Code, der irgendwie auf PC5 zugreift. Oder der Pin wird von außen auf Low gezogen. Oder es wurden nicht alle VCC/GND Pins angeschlossen.

#7857559

Stefan Frings meinte:

Vermutlich gibt es noch mehr Code, der irgendwie auf PC5 zugreift.

Das passt zu

Setze ich nun den Pullup, geht krzfristig der Pin auf High ...

Aber solange nicht einmal eindeutig klar ist, um welchen Pin es geht, ist das hier vergeudete Zeit.

OP (Firma: Chipwerkstatt) #7857579

S. L. schrieb:

Aber solange nicht einmal eindeutig klar ist, um welchen Pin es geht,

Ja sorry, habe mich im Eingangspost verschrieben. Es geht um PC5 (Pin 27) Derzeit hängt am PC5 (Pin 27) nur das Messgerät. Es kommt kein High.

Es waren in den Port-Inits tatsächlich Ungereimtheiten, die ich durch Umsetzen anscheinend nicht nachgezogen habe. Aber es hatte erstaunlicherweise alles funktioniert. Jede der Eingänge - ohne Problem. Habe nun die Direction usw. angepasst.

hier nochmal der korrigierte Codeschnipsel:

1
void initial(void)
2
 {    
3
    // **** Einrichten von Ein- und Ausgängen *************** 
4
    DDRA = 0xff;    // PortA Ausgänge
5
    DDRB = 0x48;    // PortB Ausgänge 
6
 //   DDRC = 0xdf;        // PortC Ausgänge - Bit 5 Eingang - Chip Quitierung
7
    DDRC = 0b11011111;  // PortC Ausgänge - Bit 5 Eingang - Chip Quitierung
8
    DDRD = 0xff;    // PortD Ausgänge 
9

10
     // PullUps für die Eingänge aktivieren
11
   PORTB |= (1<<PB0);  // Pull Up an Pin0 - aktivieren
12
  PORTB |= (1<<PB1);  // Pull Up an Pin1 - aktivieren
13
  PORTB |= (1<<PB2);  // Pull Up an Pin2 - aktivieren
14
  PORTB |= (1<<PB4);  // Pull Up an Pin4 - Starttaste Eingang aktivieren
15
  PORTB |= (1<<PB5);  // Pull Up an Pin5 - Goal- Eingang aktivieren
16
  PORTB |= (1<<PB7);  // Pull Up an Pin7 - Service-Taste aktivieren
17

18
  PORTC |= (1<<PC5);  // Pull Up an Pin27 - Chip issued aktivieren
19
  
20
     // **** Einrichten von Timer 1 ***************
21
    // timer mode 4, CTC, prescaler 1
(Firma: Funkenflug Industries) #7857581

Warum schreibst du das setzen der DDR-Bits nicht im selben Stil? Das wäre auffällig und deutlich weniger fehleranfällig.

Joo, das nervt richtig. Er hat keinen Stil ausgelassen. Na gut, dezimal fehlt, kommt aber bestimmt noch. Sieht aus wie aus ganz vielen Beispielen zusammenkopiert.

Derzeit hängt am PC5 (Pin 27) nur das Messgerät. Es kommt kein High.

Hast Du wie schon gesagt wurde geprüft, ob JTAG (bei den Fuses) deaktiviert ist?

OP (Firma: Chipwerkstatt) #7857583

Thomas S. schrieb:

Wenn JTAG aktiviert ist, sind die Pins PC2...PC5 beim Mega 32 auf Pullup und können nicht als I/O-Pins genutzt werden.

Das weiß ich mittlerweile auch. Habe dies im Eingangstread auch geschrieben. Ist das Häckelchen drin, geht der Pin auf High, ist das Häckelchen weg, ist der Pin Lo.

Ich ziehe auch immer den MK2 ab, wenn fertig programmiert.

OP (Firma: Chipwerkstatt) #7857588

Ben B. schrieb:

Sieht aus wie aus ganz vielen Beispielen zusammenkopiert.

Nicht wirklich, nur weil ich hier und da mal was versuche, mal so, mal anders. Und nu bin ich halt draufgekommen, wegen der Lesbarkeit in Binär zu schreiben, aber halt nur mein Problemfall. Ich find binär lesbarer als hex.

(Firma: Funkenflug Industries) #7857589

Miss am abgeschalteten AVR mal die beiden Schutzdioden, vor allem den Pin nach Masse. 0mV? -> Pin tot.

Ich find binär lesbarer als hex.

Finde ich bei den Pin-Konfigurationen auch, wenn man nicht jedes Bit einzeln setzen will. Aber dann muss man den Stil auch durchhalten, sonst wird's unübersichtlich.

#7857592

hier nochmal der korrigierte Codeschnipsel

Also gut, sieht, soweit C5 betroffen, okay aus. Dann gilt wohl

... Code, der irgendwie auf PC5 zugreift

Folglich ein Main erstellen, welches nur dieses /initial/ aufruft, dann muss C5 auf high gehen. Anschließend im eigentlichen Programm weitersuchen.

OP (Firma: Chipwerkstatt) #7857604

S. L. schrieb:

Also gut, sieht, soweit C5 betroffen, okay aus. Dann gilt wohl

... Code, der irgendwie auf PC5 zugreift

Es ist nichts außer dem Messgerät an diesem Pin angeschlussen.

Ben B. schrieb:

Miss am abgeschalteten AVR mal die beiden Schutzdioden, vor allem den Pin nach Masse. 0mV? -> Pin tot.

Dann dürfte beim setzen (häckelchen gesetzt) von Jtag nix ändern. Da geht aber der pin auf High. Habe den Pin mal extern mit 4,7K hochgezogen. Dann habe ich annähernd +Ub. Aber das Programm reagiert da nicht.

OP (Firma: Chipwerkstatt) #7857615

Gleich Wastl,

habe nun mal ein Testprogramm geschrieben. Da geht der Pin auf High.

1
*
2
 * Atmega32_Test.c
3
 *
4
 * Created: 06.04.25 20:20:37
5
 *  Author: Thomas
6
 */ 
7

8
#include <avr/io.h>
9

10
int main(void)
11
{
12
    DDRC = 0b11011111;  // PortC Ausgänge - Bit 5 Eingang - Chip Quitierung
13
    PORTC |= (1<<PC5);  // Pull Up an Pin27 - Chip issue aktivieren
14

15
    while(1)
16
    {
17

18
    }
19
}
(Firma: Funkenflug Industries) #7857616

Wie bereits gesagt wurde... Programm erstellen, was NUR den AVR bzw. NUR die Portpins konfiguriert und sonst nichts weiter tut. Irgendwie kommt mir das auch so vor, als wäre im restlichen Programm ein Fehler drin.

Edit:

habe nun mal ein Testprogramm geschrieben. Da geht der Pin auf High.

Dann hast Du diese Vermutung damit bestätigt. Viel Spaß beim Suchen in Deinem Code... Das kann Dir keiner abnehmen.

OP (Firma: Chipwerkstatt) #7857632

Ben B. schrieb:

Viel Spaß beim Suchen in Deinem Code... Das kann Dir keiner abnehmen.

Oh ja, das war ein grober Fehler. Das stammt noch aus den Anfängen. und bisher hatte es nicht gestört, dass ich auf den Ausgang geschrieben hatte. Nun aber brauchte ich von diesem Port einen Pin (PC5) als Eingang, und da stört nun das:

1
int main(void)
2
{
3
    initial();       // Initialisierung Ports etc.   
4
  check_eeprom();
5

6
   //PORTC =0; // PORT Bit  wird gesetzt
7
  PORTD |= _BV(4); // PORT Bit  wird gesetzt
8

9
  Update_Ballfreigabe(); // gleich mal sperren
10

11
   _delay_ms(100);
12
    update_display(kredits); // Display auf '0' setzen
13

14
    update_Score_Digits(); // Punktezähler auf '0' setzen
15
   
16
    while(1)
17
    {

Aber wieso meckert da nicht der Compiler, dass ich auf einen Eingang rausschreiben will?

(Firma: Funkenflug Industries) #7857638

Aber wieso meckert da nicht der Compiler, dass ich auf einen Eingang rausschreiben will?

Warum sollte er?

Wenn Du den Pin als Eingang definierst, kannst Du ja weiterhin auf PortX schreiben. Das braucht man schließlich, um den PullUp ein- oder auszuschalten. Dem Compiler ist völlig egal, ob Du einen Pin als Eingang definiert hast, oder nicht.

Man kann sogar Konstrukte bauen und auf das PinX-Register schreiben - das führt nur zu nichts weil die Hardware das einfach ignoriert.

(Firma: Funkenflug Industries) #7857643

Ähm, .... ist das was zum Essen..?

Nein, das ist der Zaunpfahl, daß Du vielleicht mal das Datenblatt lesen solltest. :)

SFIOR PUD (Bit 2) ist PullUp Disable.

Und sorry fürs Meckern, aber mach Dir mal Gedanken über den Sinn Deiner Kommentare. Wenn Du sowas dranschreibst, dann stelle Dir die Frage, ob das auch ein Fremder lesen und verstehen könnte. Wenn Du hinter PortX=0 sowas wie "Port setzen" schreibst, ist das sinnfrei. Das weiß man auch ohne den Kommentar und wozu Du das machst, ist nicht ersichtlich. Genau so wie "update_display(credits); //Display auf 0 setzen" auch nur wahr ist, solange credits den Wert 0 hat.

#7857648

Man kann sogar Konstrukte bauen und auf das PinX-Register schreiben - das führt nur zu nichts weil die Hardware das einfach ignoriert.

Das mag für einen ATmega32 noch stimmen, aber für die späteren gilt: "However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register"

(Firma: Funkenflug Industries) #7857651

Ok, dann war das PinX Register ein schlechtes Beispiel. Nehmen wir stattdessen ADCH und ADCL. Wobei ich da auch nicht weiß, ob der AVR das schreiben verhindert. Kann sein, daß man damit einfach das ADC-Ergebnis überschreibt.

OP (Firma: Chipwerkstatt) #7857666

Ben B. schrieb:

Das weiß man auch ohne den Kommentar und wozu Du das machst, ist nicht ersichtlich. Genau so wie "update_display(credits); //Display auf 0 setzen" auch nur wahr ist, solange credits den Wert 0 hat.

Das geschieht ja in der Initial in Zeile 4612. [c] score = 0; kredits =0; Chips_to_go =0; Service_Taster_Counter =0; [/c}

#7857681

Ben, die ADCH und ADCL sind read-only, da passiert beim Reinschreiben gar nichts, siehe Datenblatt Seite 202 (Figure 98. Analog to Digital Converter Block Schematic) der Pfeil geht nur in eine Richtung und Seite 217 (Register – ADCL and ADCH) bei Read/Write steht nur R.

Thomas, hast du in deinem geheimen Code schon mal nach SFIOR (Adresse $30 ($50)) oder PUD gesucht?

(Firma: matzetronics) #7857699

Wenn man an SFIOR nicht rumfummelt, sollte PUD auf 0 sein, und die Pullups damit aktiv sein. Allerdings sind im SFIOR auch die Auswahlbits für den ADC-Trigger und es könnte damit bei der lässigen Tipperei des TE aus Versehen mit beschrieben werden.

(Firma: Funkenflug Industries) #7857745

Ben, die ADCH und ADCL sind read-only, da passiert beim Reinschreiben gar nichts

Prima, dann passen die für das Beispiel. Man kann halt den Befehl assemblieren ohne eine Fehlermeldung zu bekommen, aber der macht dann halt nichts.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über ein Jahr alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.