Atmega32 - PortPin geht nicht auf High wenn Pullup gesetzt

(Firma: Chipwerkstatt) #7857531
Lesenswert?

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 ***************
(Firma: Chipwerkstatt) #7857540
Lesenswert?

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.

#7857559
Lesenswert?

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.

(Firma: Chipwerkstatt) #7857579
Lesenswert?

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
Lesenswert?

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?

(Firma: Chipwerkstatt) #7857583
Lesenswert?

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.

(Firma: Funkenflug Industries) #7857589
Lesenswert?

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
Lesenswert?

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.

(Firma: Chipwerkstatt) #7857604
Lesenswert?

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.

(Firma: Chipwerkstatt) #7857615
Lesenswert?

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
Lesenswert?

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.

(Firma: Chipwerkstatt) #7857632
Lesenswert?

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
Lesenswert?

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
Lesenswert?

Ä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
Lesenswert?

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: Chipwerkstatt) #7857666
Lesenswert?

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
Lesenswert?

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?

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