atmega32 16PU Schaltet nicht sauber

Gast #3418670
Lesenswert?
• ▲
▼
Hallo, ich bin neueinsteiger in avr und hab mir eine atmega32 16PU 
grundschaltung aufgebaut.
Der uC steuert erfollgreich ein LCD an. Jedoch Spinnen die Pins?!?!

Im Quellcod Schalte ich zum beispiel den PortA auf 0b0000001 jedoch gibt 
jetzt nicht nur PA0 2,5V sondern alle anderen auch eine geringe Spannung 
zwischen 0,8V-0,16V aus.

Das sollte doch nicht so sein oder?

Hier der Quellcode:
1
int main(void)
2
{
3
  DDRA = 0b0000000; //Port D als Ausgang
4
  DDRC = 0b0000000; //Port C als Ausgang
5
  DDRD &=~ (0 << PD7); DDRD &=~ (0 << PD6); DDRD &=~ (0 << PD5); DDRD &=~ (0 << PD4); //PortD7-4 Ausgang
6
  DDRD &=~ (1 << PD2); DDRD &=~ (1 << PD3);//PortD2-3 Eingang
7
  
8
  PORTA = 0b0000000;//Auf 0
9
  PORTC = 0b0000000;// Auf 0
10
  PORTD = (1 << PD7) | (0 << PD6) | (0 << PD5) | (0 << PD4);
11
  PORTD |= (1 << PD2); PORTD |= (1 << PD3);      
12
    
13
    lcd_init(LCD_DISP_ON);
14
    for (;;)
15
  {                         
16
       
17
        PORTA = 0b0000001;//Auf 0
18
    out("A0000001");
19
    PORTA = 0b0000010;//Auf 0
20
    out("A0000010");
21
    PORTA = 0b0000100;//Auf 0
22
    out("A0000100");
23
    PORTA = 0b0001000;//Auf 0
24
    out("A0001000");
25
    PORTA = 0b0010000;//Auf 0
26
    out("A0010000");
27
    PORTA = 0b0100000;//Auf 0
28
    out("A0100000");
29
    PORTA = 0b1000000;//Auf 0
30
    out("A1000000");
31
    PORTA = 0b0000000;
32
    
33
    PORTB = 0b0000001;//Auf 0
34
    out("B0000001");
35
    PORTB = 0b0000010;//Auf 0
36
    out("B0000010");
37
    PORTB = 0b0000100;//Auf 0
38
    out("B0000100");
39
    PORTB = 0b0001000;//Auf 0
40
    out("B0001000");
41
    PORTB = 0b0010000;//Auf 0
42
    out("B0010000");
43
    PORTB = 0b0100000;//Auf 0
44
    out("B0100000");
45
    PORTB = 0b1000000;//Auf 0
46
    out("B1000000");
47
    PORTB = 0b0000000;
48
    out("Ende");
49
    }
50
}
51

52

53

54
void wait_until_key_pressed(void)
55
{
56
  unsigned char temp1, temp2;
57
  unsigned int i;
58
  
59
  do {
60
    temp1 = PIND;                  // read input
61
    for(i=0;i<65535;i++);
62
    temp2 = PIND;                  // read input
63
    temp1 = (temp1 & temp2);       // debounce input
64
  } while ( temp1 & _BV(PIND2) );
65
  
66
  loop_until_bit_is_set(PIND,PIND2);            /* wait until key is released */
67
}
68

69
void out (const char *s)
70
{
71
  lcd_clrscr();
72
  register char c;
73

74
    while ( (c = *s++) ) {
75
        lcd_putc(c);
76
    }
77
  wait_until_key_pressed();
78
}

MfG Peter
Gast #3418913
Lesenswert?
• ▲
▼
ohhh jaa stimmt !!!! Vielen dank für die Aufmerksamen Kommentare :) 
solch banale Fehler :@

Habs jetzt verbessert:
1
  DDRA = 0b11111111; //Port A als Ausgang
2
  DDRC = 0b11111111; //Port C als Ausgang
3
  DDRD = 0b11110000; //Port D7-4 Ausgang Port D2-3 Eingang Port0-1 nichts
4
  
5
  PORTA = 0b00000000;//Auf 0
6
  PORTC = 0b00000000;// Auf 0
7
  PORTD = 0b00011100;// PortD4 auf High PortD2-3 Pullup aktiv      
8
    
9
    lcd_init(LCD_DISP_ON);
10
    for (;;)
11
  {                         
12
       
13
    PORTA = 0b00000001;//A0 1
14
    out("A00000001");
15
    PORTA = 0b00000010;//A1 1
16
    out("A00000010");
17
    PORTA = 0b00000100;//A2 1
18
    out("A00000100");
19
    PORTA = 0b00001000;//A3 1
20
    out("A00001000");
21
    PORTA = 0b00010000;//A4 1
22
    out("A00010000");
23
    PORTA = 0b00100000;//A5 1
24
    out("A00100000");
25
    PORTA = 0b01000000;//A6 1
26
    out("A01000000");
27
    PORTA = 0b10000000;//A7 1
28
    out("A10000000");
29
    PORTA = 0b00000000;//AUS
30
    
31
    PORTC = 0b00000001;//B0 1
32
    out("C00000001");
33
    PORTC = 0b00000010;//B1 1
34
    out("C00000010");
35
    PORTC = 0b00000100;
36
    out("C00000100");
37
    PORTC = 0b00001000;
38
    out("C00001000");
39
    PORTC = 0b00010000;
40
    out("C00010000");
41
    PORTC = 0b00100000;
42
    out("C00100000");
43
    PORTC = 0b01000000;
44
    out("C01000000");
45
    PORTC = 0b10000000;
46
    out("C10000000");
47
    PORTC = 0b00000000;
48
    
49
    out("Ende");
50
    }
51
}

aber seltsamerweise gibt der uC bei PORTA=0b00000001 trotzdem auf PC2-3 
High aus?
Betriebsspannung ist 5 V die Schaltung ist exakt diese hier
http://www.instructables.com/id/LED-Cube-4x4x4/step7

mfg Peter
(Firma: matzetronics) #3419301
Lesenswert?
• ▲
▼
Die erste Tat beim Mega32 ist es normalerweise, die JTAG Fuse 
abzuschalten, wenn du sie nicht brauchst und PORTC als normalen Port 
benutzen willst. JTAG liegt auf den Pins PC2-PC5, was mit der 
Beobachtung gut übereinstimmt.

Dann musst du dir darüber klar werden, das der MC wie ein Wahnsinniger 
alles innerhalb der endlosen 'for' Schleife abarbeitet, und dir ein 
schnelles Lauflicht produziert, erst auf Port A und dann auf Port C.
Mit einem Oszilloskop siehst du (JTAG Fuse ausgeschaltet), wie der MC 
nacheinander die einzelnen Pins an- und wieder abschaltet. Mit einem 
Voltmeter bekommst du da nur einen niedrigen Mittelwert von ca. 1/16 Vcc 
und das LCD wird dir nur Buchstabensalat anzeigen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.