Forum: Mikrocontroller und Digitale Elektronik atmega32 16PU Schaltet nicht sauber


von Peter (Gast)


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

von der alte Hanns (Gast)


Lesenswert?

Welche Spannung liegt an AVcc?

von spess53 (Gast)


Lesenswert?

Hi

Was erwartest du?

>DDRA = 0b0000000; //Port D als Ausgang

Schaltet Porta auf Eingang.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

DDRB wird gar nicht angefasst. Also ist der gesamte PortB auch Eingang. 
Mit den Ausgaben auf PortA und PortB schaltest du nur die internen 
Pull-Up-Widerstände.

MfG Spess

von Peter (Gast)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Vielen Danke!! das war echt ein guter tipp JTGA abzuschalten!!
Jetzt verhalten sich die Ausgänge normal. :))

von Peter (Gast)


Lesenswert?

*JTAG

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.