Datum: 11.07.2005 22:50
Tag, ich muss zum teil mit der veralteten gcc lib arbeiten, da teile meines codes mit dieser version gefertigt worden sind. jetzt möchte ich port b freischalten. macht man heutzutage ja so: DDRB = 0x00; da die alt lib mir hier aber ein invalid lvalue entgegenwirft muss ich outp benutzen. schreib ich jedoch outp(0x00,DDRB); bleibt der port geschlossen und ist kein eingang ???
Datum: 11.07.2005 23:06
Vielleicht muss es outp(DDRB,0x00) heißen.
Datum: 11.07.2005 23:16
ich seh gerade dass der port anscheinend doch freigeschaltet ist. so wies ausschaut klappt das hier nicht: while (PINB & (1<<PINB3)) wie heißt das auf "alt" also mit alten lib ? oder vielleicht kann mir jemand sagen wieso die schrittmotorsteuerung mit der alten lib funktioniert und bei der neuen lib der motor nur "rumzuckelt" als hätte er nich genügend leistung ?
Datum: 11.07.2005 23:23
sorry, nochmal ich.
int main(void)
{
stepper_on();
outp(0X00,DDRB);
// DDRB = 0x00;
sens_setLED(1,0);
uint8_t i;
uint8_t x;
uint8_t z;
while(1){
sens_setLED(0,1);
i=PINB;
z=1;
while (z<40){
x=PINB;
if (i!=x) // pin 4 high ?
{
diese codestelle mit der neuen lib und entsprechend umgeschrieben und
er geht in die if-abfrage rein und führt die nachfolgenden aktionen
aus, wenn ich was sense und sich x von i unterscheidet da sich ja der
port ändert.
mit der alten lib klappt das nicht ? wo ist das problem ? was mache ich
falsch ?
Datum: 11.07.2005 23:37
> i=PINB;
Ich meine, dass muss inp(PINB, i) oder so ähnlich lauten.
Datum: 11.07.2005 23:37
ok, ich habs jetzt geschafft mit inp die zustände abzufragen. jetzt muss ich nurnoch einzig und allein (HOFF) diese zeile if(PINB & (1<<PINB3)) so übersetzen, dass sie von der alten lib verstanden wird, wie mach ich das ?
Datum: 12.07.2005 10:17
Du liest mit inp den aktuellen Port-Status ein und testest mit & (1 << 3), ob Bit 3 gesetzt ist. PINB3 ist ja AFAIK nur ein define für die Zahl 3.
Datum: 12.07.2005 15:16
So funktioniert's:
if(inp(PINB) & (1<<PINB3)) { ... } |
Datum: 12.07.2005 18:26
super danke euch, das klappt soweit. jetzt würde ich gerne ne aktion
ausführen, wenn NUR PINB3 aus 1 gesetzt ist und PB0 bis PB2 auf 0.
SO klappt das schonmal net:
if (inp(PINB) & (1<<PINB3) & !(1<<PINB0) & !(1<<PINB1) &
!(1<<PINB2)){..
auch so:
if (inp(PINB) & (1<<PINB3) & (1>>PINB0) & (1>>PINB1) & (1>>PINB2)){..
komme ich zu keinem ergebnis ?
:(
Datum: 12.07.2005 22:15
Ich fürchte, das funktioniert auch mit && nicht. @Phozz: Du solltest überlegen, was die Bitoperatoren und was der !-Operator bewirken. Dann erkennst du bestimmt schnell, dass deine if-Abfrage so ein wenig sinnlos ist. Zum Beispiel schiebt "(1>>PINB1)" die 1 um eine Stelle nach rechts. Dummerweise kommt da 0 raus, und "irgendwas & 0" ist in jedem Fall 0, also false. Du könntest das alles mit einer Kombination von & und == erschlagen. Du müsstest nur dazu übergehen, statt endloser (1<<PINBn)-Ketten direkt den passenden Hex-Wert, die Bitmaske, in den Code zu schreiben.
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel