Forum: Compiler & IDEs Programmierfragen/Programme "C"


von S. S. (-xc-)


Lesenswert?

damit ich das schöne forum nicht mit "in 3 antworten erledigt threads" 
zuspamme halte ich den titel etwas allgemeiner zur weiteren nutzung...


erste frage:

hier mein erstes microcontroller programm.

es soll der ausgang PB0 eines ATMEGA 8L8 zwischen an und aus toggeln

würde das so funktionieren?
compiliert wird es > syntax ist also richtig


1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
main()
6
{
7
DDRB  = 0x01; //soll pin Null des ?B? Registers als ausgang einstellen
8
//
9
10
while(1)
11
{
12
  PORTB ^= (1<<0); //soll an den ausgang PB0 abwechselnd 0 und 5 Volt anlegen
13
  _delay_ms(50);   //damit man vorherige zeile auch optisch sieht evtl. etwas kurz gewählt :P
14
}
15
}


andere Frage:

bei dem befehl DDRB = 0xFF kann ich ja 8 verschiedene Beinchen 
adressieren...soviele beinchen hat der controller doch garnicht?!

wird einfach von 1 an gezählt?
wenn der controller also nur 4 beine hat hätte die Zusweisung 0x0F den 
gleichen effekt wie 0xFF?

von Christoph S. (mixer) Benutzerseite


Lesenswert?

> hier mein erstes microcontroller programm.
>
> es soll der ausgang PB0 eines ATMEGA 8L8 zwischen an und aus toggeln
>
> würde das so funktionieren?
> compiliert wird es > syntax ist also richtig
>
>
>
>
1
> #include <avr/io.h>
2
> #include <avr/interrupt.h>
3
> #include <util/delay.h>
4
> 
5
> main()
6
> {
7
> DDRB  = 0x01; //soll pin Null des ?B? Registers als ausgang einstellen
8
> //
9
> 
10
> while(1)
11
> {
12
>   PORTB ^= (1<<0); //soll an den ausgang PB0 abwechselnd 0 und 5 Volt
13
> anlegen
14
>   _delay_ms(50);   //damit man vorherige zeile auch optisch sieht evtl.
15
> etwas kurz gewählt :P
16
> }
17
> }
18
>

Sieht relativ richtig aus

> andere Frage:
>
> bei dem befehl DDRB = 0xFF kann ich ja 8 verschiedene Beinchen
> adressieren...soviele beinchen hat der controller doch garnicht?!

Das würd ich nochmal nachzählen. So viel ich weis hat ein Mega8 28 
"Beinchen" von denen 23 als I/O genutzt werden können

> wird einfach von 1 an gezählt?
> wenn der controller also nur 4 beine hat hätte die Zusweisung 0x0F den
> gleichen effekt wie 0xFF?

Wenn die oberen 4 Bits nicht für was anderes sind schon

MFG Mixer

von S. S. (-xc-)


Lesenswert?

>Das würd ich nochmal nachzählen. So viel ich weis hat ein Mega8 28
>"Beinchen" von denen 23 als I/O genutzt werden können

schon klar, aber sind die nicht noch auf die register B C und D 
aufgeteilt? und die steuert man doch seperat über (DDRB | DDRC | DDRD) 
oder nicht?

und beine mit dem namen PB z.B. hat er nur 7.


oder habe ich da was grundlegend missverstanden?

von Christoph S. (mixer) Benutzerseite


Lesenswert?

S. S. schrieb:
>>Das würd ich nochmal nachzählen. So viel ich weis hat ein Mega8 28
>>"Beinchen" von denen 23 als I/O genutzt werden können
>
> schon klar, aber sind die nicht noch auf die register B C und D
> aufgeteilt? und die steuert man doch seperat über (DDRB | DDRC | DDRD)
> oder nicht?
>
> und beine mit dem namen PB z.B. hat er nur 7.
>
>
> oder habe ich da was grundlegend missverstanden?

Wenn PB7 die höchste Zahl ist wo du findest muss das nicht heißen, dass 
er nur 7 hat. Bei Ports wird das Zählen bei 0 angefangen und wenn du von 
PB0-PB7 zählst dann kommst du auf 8 - also pro Pin ein Bit.

Wenn du dir den Port C genauer anschaust der hat z.B. in der Dil-Fassung 
nur 6 Pins - da sind dann die oberen 2 "frei"

MFG Mixer

von S. S. (-xc-)


Lesenswert?

>Wenn du dir den Port C genauer anschaust der hat z.B. in der Dil-Fassung
>nur 6 Pins - da sind dann die oberen 2 "frei"

das heißt 0xDF hätte die gleiche wirkung wie 0xFF?

wenn ich obiges programm in AVR Studio simuliere und schrittweise 
abspiele, sehe ich ja die verschiedenen Register und ihre veränderungen.
In meinem fall hüpft immer das Register R24 von 0x00 auf 0x01

spasseshalber, habe ich noch ein:
DDRC = 0x02;
und ein
PORTC = 0x02;
hinzugenommen
1
main()
2
{
3
DDRB  = 0x01; 
4
DDRC  = 0x02;
5
6
while(1)
7
{
8
  PORTB ^= 0x01;
9
        PORTC ^= 0x02;
10
  _delay_ms(50);
11
}
12
}

spiele ich das ganze schrittweise ab, springt das register R24 erst auf 
0x01 und wird im nächsten schritt mit 0x02 überschrieben...
wie kann das sein?
DDRC hat doch ein eigenes register oder nicht?

Insgesamt hat der baustein(laut simulation) 32 Register...(R00 - R31)

kommt man mit den befehlen DDRx und PORTx nur an einen einzigen?


"leicht" verwirrte grüße

ps. ja ich bin fleißig am AVR-GCC tutorial studieren...aber irgendwie 
stecke ich fest o.0

von Karl H. (kbuchegg)


Lesenswert?

S. S. schrieb:
>>Wenn du dir den Port C genauer anschaust der hat z.B. in der Dil-Fassung
>>nur 6 Pins - da sind dann die oberen 2 "frei"
>
> das heißt 0xDF hätte die gleiche wirkung wie 0xFF?

Du verwechselst da was.

Logisch gesehen besteht der Port immer aus 8 Bit.
Für dein Programm sind immer alle 8 Bit da.

Welche und wieviele dieser 8 Bits dann tatsächlich auf physikalische 
Pins aus dem Prozessor herausgeführt werden, ist ein anderes Thema.

> DDRC hat doch ein eigenes register oder nicht?

DDRC ist selbst ein Prozessorregister. Aber zunächst mal muss der Wert, 
den du an DDRC zuweisen willst in ein Arbeitsregister geladen werden, 
von wo er dann in das DDRD Register geladen wird. r24 ist ein 
Arbeitsregister und hat erst mal nichts mit DDRC zu tun. Der Prozessor 
kann nicht direkt einen Wert ins DDRC Register laden, sondern man muss 
einen Umweg über eines der Arbeitsregister nehmen.

Wie diese Arbeitsregister verwaltet werden und welcher Wert gerade in 
welchem Register steht, geht dich nichts an, das verwaltet der Compiler. 
Für dich ist nur wichtig, dass letztendlich die 0x02 im DDRC Register 
landen.

von S. S. (-xc-)


Lesenswert?

>Du verwechselst da was.
das glaube ich auch ^^

ich hole noch mal etwas weiter aus wenns ok für dich/euch ist.
aktuell verstehe ich das ganze folgendermaßen:

Ports sind schnittstellen.
ich habe 3stück davon (B | C | D)
jede dieser ports hat 8bit.
daraus resultieren 8 Schnittstellen pro Port
wieviele davon nutzbar sind ist hardware abhängig


>r24 ist ein
>Arbeitsregister und hat erst mal nichts mit DDRC zu tun. Der Prozessor
>kann nicht direkt einen Wert ins DDRC Register laden, sondern man muss
>einen Umweg über eines der Arbeitsregister nehmen.

ich habe jetzt auch die richtige anzeige gefunden ^^" die für die 
ausgänge

von Karl H. (kbuchegg)


Lesenswert?

S. S. schrieb:
>>Du verwechselst da was.
> das glaube ich auch ^^
>
> ich hole noch mal etwas weiter aus wenns ok für dich/euch ist.
> aktuell verstehe ich das ganze folgendermaßen:
>
> Ports sind schnittstellen.
> ich habe 3stück davon (B | C | D)
> jede dieser ports hat 8bit.
> daraus resultieren 8 Schnittstellen pro Port
> wieviele davon nutzbar sind ist hardware abhängig

So ungefähr.
Nutzbar sind auch die Bits die nicht nach aussen geführt werden. Dann 
allerdings bedeutet nutzbar zb. man könnte dieses Bit als 
Zwischenspeicher für das Programm benutzen, wenn man in arge 
Speichernöte kommt.
OK. Der Fall ist nicht wirklich realistisch, aber möglich.

Stell es dir so vor: In deiner Wand liegen 8 Kabel, aber nur an 5 davon 
ist am anderen Ende etwas angeschlossen.

Es empfiehlt sich, nicht davon auszugehen, dass nicht heruasgeführte 
Bits in der Programmierung nicht weiter beachtet werden müssen. 
Irgendwann portiert man sein Programm auf einen anderen (größeren) 
Prozessor, auf dem die entsprechenden Bits hardwaremässig sehr wohl 
herausgeführt werden und hat dann plötzlich klappernde Prozessor-Pins.

von S. S. (-xc-)


Lesenswert?

>So ungefähr.
das reicht mir fürs erste :P

mal wieder vielen dank für deine kompetente hilfe!

gruß

das forum ist super...endlich eins das nicht versucht smilies zu 
verbildern *.*

von S. S. (-xc-)


Lesenswert?

wofür steht das DDR bei DDRB?
ich beschäftige mich gerade mit dem watchdog und hatte gedacht das man 
dieses DDR immer davorschreibt wenn man auf register zugreift :confused:
aber den watchdog kann man ja scheinbar direkt über
WDTCR = 0x0F oä. ansprechen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Laut Datenblatt: Data Direction Register

Für solche Fragen ist das Datenblatt die erste und beste Quelle.

von Karl H. (kbuchegg)


Lesenswert?

Und auch das Tutorial hier
http://www.mikrocontroller.net/articles/AVR-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

kann dir bei deinen ersten Schritten helfen. Auch wenn das erste der 
beiden ein Assembler Tutorial ist, so sind doch viele der Grundlegenden 
Konzepte darin erläutert, so dass es sich auch für C-Programmierer 
lohnt, da mal ein oder zwei Blicke reinzuwerfen.

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.