PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem Registerprogrammierung



Hansi41
29.01.2008, 20:57
Hallo,
ich habe mir mal die Registerprogrammierung angeschaut und wollte mal gleich mit ihr die Status LED grün schalten:
Aslo habe ich folgenden code verwendet:


{
DDRD |= (1<<PD0)
PORTD |= (1<<PB0)
}

Nun zeigt mein Compiler allerdings eine Fehlermeldung an:
[size=9]-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c:1: error: parse error before '{' token
make: *** [test.o] Error 1

> Process Exit Code: 2


Ich weiß nicht was ich machen soll, was mache ich falsch?

Bitte um schnelel Antworten,
Hans :arrow: [/quote]

Ceos
29.01.2008, 21:00
ist das dein gesamter code ? oder nur n ausschnitt ?

Hansi41
29.01.2008, 21:00
ne das ist mein gesamter code

Hansi41
29.01.2008, 21:01
fehlt da was?, habe ich was vergessen?

Ceos
29.01.2008, 21:07
autsch >_< da fehlen wohl die C-Grundlagen ...

schau dir die beispiel codes bitte an

ein grundgerüst ist z.B.




#include "asuro_prog.h" // lädt die bibliothek für die befehle

int main(void) //der einsprungpunkt ist immer die main-methode
{
Init(); // initialisieren des prozessor
// hier kannst du variablen initialisieren und auch
// lichter die dauerhaft an sein sollen (dein code z.B.)
while(1){
// hier wird permanent eine schleife durchlaufen
// hier fragst du z.B. regelmäßig die taster ab und reagierst
}
return 0; // das ist nur obligatorisch ... dein asuro sollte NIE
// aus der schleife kommen, dann ist sein zustand undefiniert
}


EDIT: sorry das einrücken iss bissl schief gegangen ich hoffe es geht so besser

radbruch
29.01.2008, 21:34
Hallo

Ein komplettes Programm sieht etwa so aus:

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
DDRB=0; // nicht benoetigte Ports auf Eingang setzen
DDRC=0;
DDRD=0b00000100; //rote StatusLED haengt an PD2(= Port D, Bit2)
PORTD=0b00000100; // Ausgang setzen
while(1);
return(0);
}


Und noch meine ersten Versuche, eine Tastenabfrage:

#include <avr/io.h>
#include <avr/interrupt.h>


int main(void)
{
unsigned int i,j;

for (i=0; i < 20; i++) { for (j=0; j < 65535; j++); }
DDRB=0; // nicht benoetigte Ports auf Eingang setzen
DDRC=0;
DDRD=0b00000100; //rote StatusLED haengt an PD2(= Port D, Bit2)
PORTD=0b00000100;
while(1)
{
/*
Die Tasten haengen an PortC Bit4. Wenn keine Taste gedrueckt ist,
wird ueber R23 VCC an diesen Pin gelegt. Das ergibt eine 1 beim Einlesen.

Wenn man dann eine Taste drueckt, ergibt sich ein Spannungsteiler,
bei dem der Pin dann deutlich, bei K6 1000K zu 68K, nach 0V gezogen wird.
Das ergibt eine 0 am Eingang.

Den C7 kann man ignorieren, R24 ebenfalls, weil PD3 als Eingang (ohne Pullup?)
geschaltet ist.
*/

if (PINC & 0b00010000) // PortC Bit4 ist der Tasteneingang
{
PORTD=0b00000100; // StatusLED rot setzen
}
else
{
PORTD=0b00000000; // StatusLED ausschalten
}

/*
Spätestens jetzt wird auch mir klar, dass die Bitschieberei effektiver ist:

PORTD=((PINC & (1<<PC4)) >> 2);

*/
}
return(0);
}
..und noch eine Einschaltverzögerung:
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned int timer_startwert=65536-7812; // 8MHz/1024=7812,5
int main(void)
{
DDRB=0; // nicht benoetigte Ports auf Eingang setzen
PORTB=0; // und die Pullups aus, sonst "glimmt" die StatusLED gruen
DDRC=0;
PORTC=0;
DDRD=(1 << PD2); //rote StatusLED haengt an PD2(= Port D, Bit2)
DDRD|=(1 << PD7); // Kathoden der BackLEDs haengen auf PD7
PORTD=(1 << PD7); // high an PD7 schaltet die BackLEDs aus

/* Es folgt eine Einschaltverzögerung von ca. 1 Sekunde */
TCNT1=timer_startwert; // 16-Bit auf einmal laden?
TCCR1B |= 0b00000101; // Prescaller Timer1 auf 1024 setzen
while(!(TIFR & (1 <<TOV1) )); //Warten bis Überlauf Timer1
TCCR1B &= ~0b00000101; // Prescaller löschen bedeutet Timer1 stoppen
TIFR = (1 << TOV1); // Flag setzen bedeutet Flag wieder löschen

while(1) PORTD=(1 << PD7) | ((PINC & (1<<PC4)) >> 2); // eine Taste schaltet StatusLED aus

return(0);
}


Dann wurde mein RP6 geliefert und der asuro eingemottet...

Gruß

mic

Ceos
29.01.2008, 21:37
ja sry ich hab gedacht das er den asuro weiterhin mit normalen befehlen füttern will :p

Hansi41
30.01.2008, 15:03
Hallo,
also erstmal dne ASURO mit vorgefertigten Funktionen zu füttern, das kann ich schon
nun zum eig thema:
wenn ich nun deinen programm code compiliere, dann kommt folgende fehlermeldung,
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c:8:9: invalid suffix "b00000100" on integer constant
test.c:9:10: invalid suffix "b00000100" on integer constant
make: *** [test.o] Error 1

> Process Exit Code: 2

woran könnte das liegen?

radbruch
30.01.2008, 15:09
Hallo

Das liegt an avr-gcc, das kann manchmal keine binären Zahlen. Du kannst 0b00000100 durch (1<<2) oder 4 ersetzen. ( und 0b00010000 durch 16)

Gruß

mic

Hansi41
30.01.2008, 15:20
also sähe dann mein programm wie folgt aus:


#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
DDRB=0; // nicht benoetigte Ports auf Eingang setzen
DDRC=0;
DDRD=4; //rote StatusLED haengt an PD2(= Port D, Bit2)
PORTD=4; // Ausgang setzen
while(1);
return(0);
}

oder, etwa nicht?

Hansi41
30.01.2008, 15:29
hallo, habe es mal ausprobiert und es funktioniert tatsöchlich, habe allerdings noch verständnis schwierigkeiten mit dem code, könntest du mir ihn noch mals erklären?
Danke!

MartinFunk
30.01.2008, 15:34
hi,
avr-gcc kann komischerweise nur in verwendung mit AVR Studio binär zahlen!!

Mfg Martin

radbruch
30.01.2008, 15:44
Hallo


#include <avr/io.h>Über das make-File werden die kontrollerabhängigen Hardware-#defines geladen.


#include <avr/interrupt.h>Bindet eine funktionierende Sprungtabelle mit dummy-ISR ein. Vorsichtshalber...


int main(void)
{ DDRB=0; // nicht benoetigte Ports auf Eingang setzen
DDRC=0; Eigentlich unnötig, weil die Ports nach dem Reset eh Eingang sind.


DDRD=4; //rote StatusLED haengt an PD2(= Port D, Bit2) PORTD.2 auf Ausgang setzen. Das waren ja meine Anfänge, heute würde ich DDRD|=(1<<2) schreiben.


PORTD=4; // Ausgang setzendito


while(1);
return(0);
}nie zurückspringen

Ich verwende kamAVR.

Gruß

mic

Hansi41
30.01.2008, 17:44
hi
habe nun mal zum Test folgendes programm geschrieben,


#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
DDRD |= (1<<6);
PORTD |= (1<<6);
while(1);
return 0;
}

und siehe da, die FrontLED leuchtet, nun werde ich mal versuchen die motoren an zu bekommen, muss ich da irgendetwas besonderes beachten?

Ceos
30.01.2008, 17:53
wenn deine englischkenntnisse nicht allszu eingerostet sind empfehle ich dringen die register und ihre bedeutung im datenblatt zum atmega zu studieren ... ich lerne mich gerade in das gleich ein, allerdings mit nem atmega162 mit ISP und AVR-Studio (kosten für aufbau: 50€ der programmer 10€ die bstückung für den programmer, 2h löten (umlöten der pins auf buchsen hat die meiste zeit gekostet), paar neue atmega-chips für paar euro, etwa 5h datenblatt lesen, 1h proggen und siehe da ich hab n lauflicht >_< aberich kanns auf 100nS genau einstellen ^^)
PS: wenn du ne serielle schnittstelle hast reichen 15€ zum programmieren des chip, die software ist kostenlos

Hansi41
30.01.2008, 18:00
ja da bin ich schon die ganze zeit dabei, nur mein vorteil ist, dass ich das buch mehr spaß mit ASURO besitze, dadurch besitze ich alles schön tabelarisch geordnet, und auf deutsch!
sonst würde mir wohl auch nur der umweg über das datenblat helfen^^

damaltor
31.01.2008, 14:25
hi,
avr-gcc kann komischerweise nur in verwendung mit AVR Studio binär zahlen!!

Mfg Martin

vermute mal, dass avrstudio die zaheln gcc-tauglich umrechnet...

Ceos
31.01.2008, 20:43
naja Hansi ... aber die meisten sachen sind asuro kompatibel erklärt in dem buch ... d.h. wenn da mal n anderer chip kommt der was kann was der asuro nich kann stehst wieder vor großem fragezeichen .... PS wenn du zu den Timern und PWM Ports kommst, helf ich dir gerne weiter, das datenblatt war bissl viel und schwer zu lesen aber irgendwann iss mir auch n licht aufgegange ^^ auch wenn cih noch nciht ganz begriffen habe was es mit den waveforms auf sich hat und welche form ich für was brauche >_< CTC macht mir iwie am meisten sinn