Hallo Ich hoffe ihr könnt mir das erklären. Meiner einer hatte jetzt vor von assambler auf C umzusteigen. Ich denke schauen wir mal in den mitgegebenen Beispielen. Da finde ich follgendes: //---------------------------------------------------------------------- // Titel : Beispiel IN/OUT für SiSy AVR-Board //---------------------------------------------------------------------- // Funktion : LED über Taster einschalten // Schaltung : Taster an PORTD.2, LED an PORTB.0 //---------------------------------------------------------------------- // Prozessor : ATmega8 3.6864 MHz // Sprache : C // Datum : 17.03.2004 // Version : 1.2 // Autor : Dipl. Ing. Päd. Alexander Huwaldt //---------------------------------------------------------------------- #include <io.h> #include <avr/wdt.h> //---------------------------------------------------------------------- main() { unsigned char i; //hier Init-Code eingeben DDRB = 0xFF; // PORTB = Ausgang DDRD = 0x00; // PORTD = Eingang PORTD = 0xFF; // PORTD = PULL-UP while (true) // Mainloop { wdt_reset (); // Wachhund zurückpfeifen // eine einfache Warteschleife for (int k=0; k<1000; k++) {}; if (!(PIND&0x04)) //Bit 3 = 0 dann ist Taster gedrückt PORTB = i; i++; } } eine sache ist hir direckt klar es fehlt die CPU Angabe, kein Thema eingesetzt, jetzt bekomme ich die Fehlermeldung beim Kompilieren: Taste_LED_C.cc:14:16: error: io.h: Datei nicht gefunden. Ende. OK ich nicht arbeitsscheu dan habe ich die Zeile //#include <io.h> rausgenommen mir war klar das ich damit eine wichtge funktion wegnehme aber versuch .... Meine erste Frage wo bekomme ich die io.h her sollte die nicht da sein?? und warum schaltet die LED nicht sauber, ich gehe davon aus das es an der fehlenden ih.h liegt ist die Annahme richtig? ich bedanke mich martin
Was hast du denn installiert und was wie aufgerufen? Auf welchem System?
#include <io.h> -> #include <avr/io.h> Martin X. schrieb: > und warum schaltet die LED nicht sauber, ich gehe davon aus das es an > der fehlenden ih.h liegt ist die Annahme richtig? Was soll "schaltet die LED nicht sauber" überhaupt konkret bedeuten? Ansonsten: schlechtes Beispiel. Die Warteschleife wird vom Optimizer komplett entfernt. Was soll zum "if" gehören? Wirklich nur "PORTB = i;", oder fehlt da eine Klammerung?
sorry habe ich vergessen Hardware MyAVR Bord V2.07 Software SiSy für Win Betriebsystem Win 7 Prof. und Kompiliert habe ich das mit dem Programm das ich bei SiSy dabeibekommen habe, bis jetzt tat das immer seinen Sienst . MFG Martin
Martin X. schrieb:
> Software SiSy für Win
Haben die einen eigenen Compiler? Dann vergiss meinen Post, ich war vom
avr-gcc ausgegangen.
Martin X. schrieb: > // Prozessor : ATmega8 3.6864 MHz >[...] > eine sache ist hir direckt klar es fehlt die CPU Angabe Ist ATmega8@3.6864MHz keine CPU Angabe?
Hallo erstmal Ich danke schonmal @ Stefan Das ist eine ORG. Datei von AVR k.a. warum die das machen ich dachte ich kan das erst mal versuchen und dan mal weiter... Um das besser darzustellen habe ich das mal aufgenommen nund hochgeladen. www.techniker-klasse.de/upload/1.wmv ich hoffe da kann man das sehen. MFG Martin
Das Demo-Video zeigt, dass das Programm richtig läuft: - Bei gedrücktem Taster ist die LED halbhell, denn sie erhält ca. 50% PWM (den Inhalt von i++, der in einer Schleife inkrementiert wird). - Bei Loslassen des Tasters ist der Zustand zufällig (wo halt i++ stand beim Loslassen). - Die Warteschleife ist nicht sichtbar -- denn sie wird wegoptimiert, da k nicht volatile ist. Also irgendwie alles prima (außer dem Programm, das Murks ist).
Hmm ich wollte egentlich nur ein Taster machen die mir eine LED schaltet ein PWM wollte ich nicht was für eine schitt beispieldatei. Was muß ich blöd gesagt schreiben ich kenne das von assambler. So kenne ich das in assambler mainloop: wdr ldi r16, 0b00000111 ; Wert bei Taste nicht gedrückt sbis PIND, 2 ; Tatse auswerten ldi r16, 0b00000000 ; Wert bei Taste gedrückt out PORTB, r16 ; LED an/aus rjmp mainloop und ich will doch nicht zu fiel oder? Thx erstmal Martin
@Martin
>Was muß ich blöd gesagt schreiben ich kenne das von assambler.
1 | ...
|
2 | while(1) |
3 | {
|
4 | if(PIND & (1<<2)) |
5 | PORTB = 0x7; // 0b00000111 |
6 | else
|
7 | PORTB = 0; |
8 | }
|
9 | ...
|
Das entspricht Deinem Assembler-Code. MfG Mark EDIT: wdt_reset(); muss natürlich auch noch rein.
Hallo Mark So das geht. Sage schonml danke Jetzt noch eine sache die ich ausprobirt habe die aber nur in fehler endet die sagen das der Befehl nicht vorhabden ist. In assambler kann ich einzelne ausgangsbits setzen mit sbi PORTB,2 Wenn ich diesen befehl in C versuche "einzubetten" bekomme ich nur fehler. Kan das sein das das nicht möglich ist das ich nur komplette Byts ausgeben kann? Thx Martin
So ich wollte noch eine erweiterung machen aber das geht leider nicht. Wen ich eine Zeit reinsezen will ( ja ich habe die anderen foren gesehen) bekomme ich auch mal wieder einen fehler
1 | #define F_CPU 3686400 |
2 | #include <avr\io.h> |
3 | #include <util\delay.h> |
4 | |
5 | |
6 | //------------------------------------------------------------------------ |
7 | // Initialisierungen |
8 | //------------------------------------------------------------------------ |
9 | void init() |
10 | { |
11 | // Ports initialisieren |
12 | sbi(DDRB,0); // PORTB0 auf Ausgang |
13 | sbi(DDRB,1); // PORTB1 auf Ausgang |
14 | cbi(DDRD,2); // PORTD2 auf Eingang mit PullUp |
15 | sbi(PORTD,2); |
16 | cbi(DDRD,3); // PORTD2 auf Eingang mit PullUp |
17 | sbi(PORTD,3); |
18 | } |
19 | |
20 | ///////////////////////////////////////////////////////////////////////////// |
21 | // Main-Funktion |
22 | ///////////////////////////////////////////////////////////////////////////// |
23 | main() |
24 | { |
25 | init(); // Initialisierungen |
26 | while(1) |
27 | { |
28 | if(PIND & (1<<2) | PIND & (1<<3)) |
29 | // DDRB |= Bit0; // LED einschalten |
30 | _delay_ms(100) ; |
31 | PORTB = 0x1; // 0b00000001 |
32 | else |
33 | // cbi PORTB =2 ; // LED ausschalten |
34 | PORTB = 0; |
35 | } |
36 | // Mainloop-Begin |
37 | { |
38 | //... |
39 | } // Mainloop-Ende |
40 | } |
41 | //--------------------------------------------------------------------------- |
Fehler beim Komp. Kompiliere die Datei Und_test.cc. Und_test.cc: In function 'int main()': Und_test.cc:50: error: 'else' without a previous 'if' Ende. Laut den beiträgen sollte das so gehen. Martin
@Martin X. Der Fehler kommt dahar, weil nach der if-Abfrage bei erfüllter Bedingung nur ein Statement ausgeführt wird. In Deinem Beispiel sind es aber 2, nämlich _delay_ms(100); und PORTB = 0x1; weshalb sich die Stelle nach "PORTB = 0x1;" nicht im mehr im Kontext der if-Abfrage befindet und der Fehler generiert wird. Mehrere Statements zu einer Abfrage müssen deshalb in geschweifte Klammern { } eingeschlossen werden. cbi und sbi sind Assemblerbefehle und deshalb nicht in C verfügbar. Bits setzen und löschen tut man mit Operatoren wie |, &, ^... Siehe dazu http://www.mikrocontroller.net/articles/Bitmanipulation MfG Mark
Ok Ich habe das mal getestet und darauf währe ich nicht gekommen. Jetzt macht er die delay beim zu und abschalten aber das sollte der eigentlich nicht machen weil der delay nur beim einschalten drin ist.hmmm. Sage erstmal danke. wen einer sagen kan warum die zeit bein ab und zuschalten drin ist würde ich mich freuen. Bis denne martin
Hallo Ich kan keine Beiträge bearbeiten deswegen schreibe ich das drunter. "Fehler" der unten beschrieben wurde gefunden wen ich noch in der schleife bin ist das klar das ich da eine verzögerung habe. Erst nachdenken... Mfg martin
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.