Forum: Mikrocontroller und Digitale Elektronik Atmega8: Lauflicht über die Pins PDn und PBn


von Thomas (Gast)


Lesenswert?

Hallo,

ich veruche gerade die Pins PD00 - PD07 und PB00 - PB07 anzusprechen. 
Dazu habe ich das folgende C-Programm geschrieben, was allerdings gar 
nichts an den Ausgängen macht. Sieht jemand den Fehler? Würde mich 
freuen ;-)

Gruß Thomas

Hier das Programm:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void writeB(int num)
5
{
6
  DDRB = num;
7
}
8
void writeD(int num)
9
{
10
  DDRB = num;
11
}
12
13
int main()
14
{
15
  // Port B = LED; Port D = Taster
16
  
17
  DDRB = 0xff;
18
  DDRD = 0xff;
19
  PORTD = 0xff;
20
  PORTB = 0xff;
21
  
22
  while(1)
23
  {
24
    writeD(0x01);
25
    _delay_ms(350);
26
    writeD(0x02);
27
    _delay_ms(350);
28
    writeD(0x04);
29
    _delay_ms(350);
30
    writeD(0x08);
31
    _delay_ms(350);
32
    writeD(0x10);
33
    _delay_ms(350);
34
    writeD(0x20);
35
    _delay_ms(350);
36
    writeD(0x40);
37
    _delay_ms(350);
38
    writeD(0x80);
39
    _delay_ms(350);
40
    
41
    writeB(0x01);
42
    _delay_ms(350);
43
    writeB(0x02);
44
    _delay_ms(350);
45
    writeB(0x04);
46
    _delay_ms(350);
47
    writeB(0x08);
48
    _delay_ms(350);
49
    writeB(0x10);
50
    _delay_ms(350);
51
    writeB(0x20);
52
    _delay_ms(350);
53
    writeB(0x40);
54
    _delay_ms(350);
55
    writeB(0x80);
56
    _delay_ms(350);
57
  }
58
}

von DDRB PORTB (Gast)


Lesenswert?

Vielleicht möchtest Du in der Funktion writeB den Port beschreiben, 
anstatt das Datenrichtungsregister.

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Und in writeD auch die Register für Port D nehmen.

Ein int als Parameter ist da auch nicht so Toll, ein unsigned char wäre 
wohl Ratsamer.

Grüße,

Chris

von Thomas (Gast)


Lesenswert?

Danke erst einmal für die Tipps! Habe die Fehler nun korrigiert, 
allerdings tut sich noch immer nichts, weder am Port B noch am Port D...

Hier nun der korrigierte Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void writeB(unsigned char num)
5
{
6
  PORTB = num;
7
}
8
void writeD(unsigned char num)
9
{
10
  PORTD = num;
11
}
12
13
int main()
14
{
15
  // Port B = LED; Port D = Taster
16
  
17
  DDRB = 0xff;
18
  DDRD = 0xff;
19
  PORTD = 0xff;
20
  PORTB = 0xff;
21
  
22
  while(1)
23
  {
24
    writeD(0x01);
25
    _delay_ms(350);
26
    writeD(0x02);
27
    _delay_ms(350);
28
    writeD(0x04);
29
    _delay_ms(350);
30
    writeD(0x08);
31
    _delay_ms(350);
32
    writeD(0x10);
33
    _delay_ms(350);
34
    writeD(0x20);
35
    _delay_ms(350);
36
    writeD(0x40);
37
    _delay_ms(350);
38
    writeD(0x80);
39
    _delay_ms(350);
40
    
41
    writeB(0x01);
42
    _delay_ms(350);
43
    writeB(0x02);
44
    _delay_ms(350);
45
    writeB(0x04);
46
    _delay_ms(350);
47
    writeB(0x08);
48
    _delay_ms(350);
49
    writeB(0x10);
50
    _delay_ms(350);
51
    writeB(0x20);
52
    _delay_ms(350);
53
    writeB(0x40);
54
    _delay_ms(350);
55
    writeB(0x80);
56
    _delay_ms(350);
57
  }
58
}

von Thomas (Gast)


Lesenswert?

Der Kommentar, der noch im Code steht (// Port B = LED; Port D = Taster) 
ist natürlich quark. An beiden Ports hängen LEDs...

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Schalplan? Layout? Aufbau? Alles richtig konfiguriert? Richtige Spannung 
angelegt? Richtigen Oszillator ausgewählt? ....

Sorry, meine Glaskugel ist grad in Reparatur.

Grüße,

Chris

Edit: So benutzt Du z.B. eine delay() Funktion. Woher aber weiss die 
Funktion denn die Taktgeschwindigkeit des µC? Wird da normalerweise 
nicht irgendwo ein #define eingebaut um das anzugeben?

von Thomas J. (Gast)


Lesenswert?

Christian Klippel schrieb:
> Schalplan? Layout? Aufbau? Alles richtig konfiguriert? Richtige Spannung
> angelegt? Richtigen Oszillator ausgewählt? ....

Den einzigen Schaltplan, an den ich mich orientiert habe bzw. den ich 
vorzeigen kann, ist der folgende: 
http://www.mikrocontroller.net/wikifiles/f/f6/Mega8_Tutorial.png
Und nach dieser Schaltung die Low-Current-LEDs an die oben genannten 
Pins drangelötet: http://www.mikrocontroller.net/wikifiles/b/bb/Led.gif

Was meinst du mit "Layout"? Das Platinenlayout? Ich habe einfach eine 
Lochrasterplatine genommen und die Pins und Bautelemente nach dem 
Schaltplan zusammengelötet.

Die restlichen Antworten kann ich mit Ja beantworten, denn 
Assembler-Code (alle LEDs anschlaten) läuft problemlos. Daher denke ich, 
dass das Problem im C-Code liegen muss.

Christian Klippel schrieb:
>
> Edit: So benutzt Du z.B. eine delay() Funktion. Woher aber weiss die
> Funktion denn die Taktgeschwindigkeit des µC? Wird da normalerweise
> nicht irgendwo ein #define eingebaut um das anzugeben?

Danke! Das war's. Der folgende Codeschnippsel hat am Anfang des Skrpts 
gefehlt:
1
#define F_CPU 4000000

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.