Forum: Mikrocontroller und Digitale Elektronik Brauch hilfe beim programmieren.


von demajor (Gast)


Lesenswert?

servus,
ich habe das avrstudio4 und winavr installiert und versuche jetz ein 
testprogramm für mein atxmega128a1 zu schreiben.
nur leider kann ich nich übersetzen:
#include <avr/io.h>

int main(void) {
DDRB |= (1 << PB1);
PORTB |= (1 << PB1);

return 0;
}

is da irgendein fehler??

Erster Error:
'DDRB' undeclared (first use in this function)
.. selbe für PORTB

lg..

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,

schau mal bitte, ob in der Liste an der Seite (siehe Screenshot) die 
io.h aufgeführt wird.
Es klingt so, als könnte der Compiler sie nicht finden. Eigentlich 
sollte er dann jedoch schon vorher einen Fehler ausgeben, wie "...io.h: 
no such file or directory".

von ... (Gast)


Lesenswert?

DDRB gibts doch beim *X*Mega gar nicht. Und PORTB ist ein struct.
Schau ins Datanblatt oder in iox128a1.h oder besser in Beides.

von demajor (Gast)


Angehängte Dateien:

Lesenswert?

servus,
also ich wüsste nich warum es den PORTB nich gibt oder eine struct 
(keine ahnung was das bedeutet) ist?? hab ein foto hochgeladen. welche 
ports kann ich denn benutzen bzw programmieren um leds usw anzusteuern??
ob die io.h drin is schau ich direkt ma nach...
vielen dank...

von demajor (Gast)


Lesenswert?

also die io.h is auch eingebunden ... weiß da keiner was??

von A. M. (am85)


Lesenswert?

demajor schrieb:
> oder eine struct (keine ahnung was das bedeutet)

Oh, böser Fehler. Wie steht es denn um deine allgemeinen Kenntnisse 
bezüglich Mikrocontroller und C Programmierung?

von spess53 (Gast)


Lesenswert?

Hi

>also ich wüsste nich warum es den PORTB nich gibt...

PORTx, DDRX, PINx gibt es beim ATXMega nicht. Lies bitte im Manual A 
nach.

MfG Spess

von demajor (Gast)


Lesenswert?

mit mc siehts nich so gut aus ... is mein 2. projekt was ich gestartet 
hab.. das erste war eine lauflicht mit ner 7x20er matrix, laufn halt 
paar wörter durch etc, das ganze aber übern atmega32. da hat die 
programmierung so hingehaun.. meine c kenntnisse gehen eher in richtung 
konsolen programmierung ... hab aber schon was heraus gefunden:

#include <avr/io.h>

int main(void) {
PORTB.DIR = 0xFF;
PORTB.OUT = 1;

return 0;
}

lässt sich übersetzen und auch übertragen. die led am Port B Pin 1 
leuchtet aber trotzdem nicht...

von A. M. (am85)


Lesenswert?

demajor schrieb:
> meine c kenntnisse gehen eher in richtung
> konsolen programmierung

Dann wirst du ja auch wissen, was eine struct in C ist, oder?

demajor schrieb:
> lässt sich übersetzen und auch übertragen. die led am Port B Pin 1
> leuchtet aber trotzdem nicht...

Der Compiler übersetzt alles, was von der Syntax her richtig ist. Er 
überprüft aber nicht, ob irgendwelche Macros vielleicht auf falsche 
Addressen zeigen. Nimm da mal den Ratschlag von spess53 an.

von Karl H. (kbuchegg)


Lesenswert?

demajor schrieb:
> mit mc siehts nich so gut aus ... is mein 2. projekt was ich gestartet
> hab.. das erste war eine lauflicht mit ner 7x20er matrix, laufn halt
> paar wörter durch etc, das ganze aber übern atmega32. da hat die
> programmierung so hingehaun.. meine c kenntnisse gehen eher in richtung
> konsolen programmierung ... hab aber schon was heraus gefunden:
>
> #include <avr/io.h>
>
> int main(void) {
> PORTB.DIR = 0xFF;
> PORTB.OUT = 1;
>
> return 0;
> }
>
> lässt sich übersetzen und auch übertragen. die led am Port B Pin 1
> leuchtet aber trotzdem nicht...

Das kann jetzt natürlich daran liegen, dass dein LED gegen Vcc 
geschaltet ist, in diesem Falle musst du den Pin auf 0 setzen

Mach doch einfach
PORTB.OUT = 0xAA;

Dann haben die Pins abwechselnd 0 1 0 1 0 1 0 1
und mit einem Multimeter (oder LED) kann man das gut detektieren.

von demajor (Gast)


Lesenswert?

led leuchtet... yeppih
wollt sie jetz nur mal zum blinken bring:
#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 1000000UL //1Mhz

int main(void) {
PORTB.DIR = 0xFF;
while(1) {
   PORTB.OUT |= (1<<PIN1);
   _delay_ms(1000);
   PORTB.OUT |= (0<<PIN1);
   _delay_ms(1000);
}

return 0;
}

... 0 Errors, 0 Warnings

blinken tut sie aber nicht...
für mich is das delay nur wichtig fürs entprellen der Taster...

von ich (Gast)


Lesenswert?

>PORTB.OUT |= (0<<PIN1);

eine 1 mit einer 0 zu "verodern" ist auch nicht sinvoll...

versuchs so:

int main(void) {
PORTB.DIR = 0xFF;
while(1) {
   PORTB.OUTSET = 0xFF;
   _delay_ms(1000);
   PORTB.OUTCLR = 0xFF;
   _delay_ms(1000);
}

von Karl H. (kbuchegg)


Lesenswert?

demajor schrieb:

>    PORTB.OUT |= (0<<PIN1);

Sagtest du nicht, du hättest schon Mega32 programmiert?

von demajor (Gast)


Lesenswert?

joo cool besten dank .. dann hab ich den anfang geschafft ... nette 
antwort von "ich"... tipp hatt sofort geholfen!
ich habe mega32 geproggt nur da immer:
DDRB = 0b00000010;
PORTB = 0b00000010;

is so natürlich kleine umstellung..

VIELEN DANK

von Karl H. (kbuchegg)


Lesenswert?

demajor schrieb:
> joo cool besten dank .. dann hab ich den anfang geschafft ... nette
> antwort von "ich"... tipp hatt sofort geholfen!
> ich habe mega32 geproggt nur da immer:
> DDRB = 0b00000010;
> PORTB = 0b00000010;

Da hättest du da mal in deine Programmier-Ausbildung investieren sollen.
Das ist genau der Stil, von dem einen hier im Forum am heftigsten 
abgeraten wird.

http://www.mikrocontroller.net/articles/Bitmanipulation

von ich (Gast)


Lesenswert?

zumal die Bitmanipulation bei den xmegas sowas von genial gelöst wurde 
mit .OUTSET, .OUTCLR .OUTTGL
Ist deutlich schöner lesbarer und abgesehen davon etwa doppelt so 
schnell wie mit der "klassischen" Methode.

Ich kann dir nur ans Herz legen die Xmega Application Notes von Atmel zu 
lesen. Geballte Info ohne viel drumrum.

von KiwiNane (Gast)


Lesenswert?

hey, endlich mal ein thread der kurz und knapp led ansteuerung beim 
xmega aufzeigt! ich wollte nur mal wissen wie man einen Taster, der an 
VCC angeschlossen ist, richtig abfragt:

PORTH.DIR &= ~(1<<PIN0);
if(PORTH.IN & 0b00000001) {
   //FKT
}

funktioniert bei mir nicht richtig. Ich hab entprellte Taster, also kann 
es daran eig auch nicht liegen.

MfG KiwiNane

PS Taster wie zu sehen an PORTH Pin0

von KiwiNane (Gast)


Lesenswert?

achso ... der rest des Ports H wird nicht verwendet..

von KiwiNane (Gast)


Lesenswert?

weiß keiner was??

von Karl H. (kbuchegg)


Lesenswert?

Eine Ausgabemöglichkeit vorsehen und wenn es nur 8 Leds an einem anderen 
Port sind.
Dann den PINH komplett, ohne irgendwas daran zu verändern, auf diesen 
LED-Port rausschieben.
Dann die Tasten drücken und nachsehen, was die LED machen.


(Ich schätze das es wieder mal eines von 2 üblichen Problemen ist:
* Du gehst davon aus, dass die Tasten eine 1 liefern, wenn sie gedrückt
  werden. In Wirklichkeit liefern sie aber eine 0
* Du hast keine Pullup oder Pulldown Widerstände. Weder externe noch
  interne

Das dritte übliche Problem
"funktioniert bei mir nicht richtig" ist keine vernünftige 
Fehlerbeschreibung mit der man was anfangen könnte. "Doktor, es tut weh" 
ist nichts, womit ein Arzt eine fundierte Diagnose stellen könnte. Noch 
nicht einmal ansatzweise.

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.