Hey Leute! Habe folgendes Problem: Möchte ein simples Programm schreiben für den Mega8L Controller. Das drei LEDs jeweils an Port0 bis Port2 an und ausmacht. Wie mach ich das habe zwar schon paar Sachen gefunden jedoch gehen die Befehle bei Code Vision nicht ... Kennt sich einer mit CodeVision aus wie man da die Ports ansteuert etc. bin für jede hilfe sehr dankbar gerne auch links die C Programmierung erklären ambesten für CodeVision AVR. Außerdem wäre es sehr nett wenn einer so ein Prog für mich schreibt bzw. erklärt wie ich mit Code Vision das machen kann über die befehle outp u. ldi geht das leider nicht. Danke schon mal im Vorraus
Kann mir denn keiner helfen oder benutzt keiner CodeVisionAVR?
Gast
#816194
eilig? Dann helfen eigene Grundlagen am schnellsten weiter, denn sonst musst du beim nächsten kleinen Problem wieder 1/4h warten.... CodeVision ist ein C-Compiler, was du da machen willst, ist Assembler. Programme schreibe ich grundsätzlich nur gegen Bares. Wenn du einzelne spezielle Probleme hast, helfe ich dir gerne.
Ja ich will ja bei CodeVisionAVR Programmieren weiß nur nicht wie man z.b Ports zu weißt bzw. Register kann mir vllt einer einen anfang schreiben damit ich das prinzip verstehen kann wäre echt nett sonst komm ich nie weiter suche schon paar tage im inet aber mit codevision gibs fast nix
Gast
#816205
du brauchst auch (fast) nichts speziellen zu CV, ist halt ein normaler C-Compiler. Und wenn du dann noch den CodeWizard von CV benutz, bist du mit deinem Programm schon fast fertig.
wenns nicht unbedingt CodeVision sein muss, dass lade dir das WinAVR Package runter und installier das mal, dazu gibts viele viele Tutorials im Netz. Auszug für Dein Problem:
1 | |
schreint in das Register PORTB deb Wert 0x03 => 0b00000111 was soviel heißt wie PB2 PB1 und PB0 auf 1. Funktion: schaltet die LEDs aus... Das Gegenteil erreichst du mit
1 | |
das schaltet PB2, PB1 und PB0 auf 0 => LEDs leuchten. Beschaltung: VCC --> LED --> R --> AVR PORTBx Immer sorum schalten, da ein Port mehr Strom aufnehmen als treiben kann (sdiehe Datenblatt). Ich glaube im CodeVision funktioniert das ähnlich (aber ohne Gewähr) Grüße, Markus
#include <Mega8.h>
void main(void) {
PORTD.0=1111110; // Port D0 auf Masse
}
Ist das Prog richtig kann ich dadurch die LED an Port D0 anmachen? Oder
Wie muss ich das bei Code Vision schreiben?
Gast
#816222
erstmal musst du dem Port sagen, dass es ein Ausgang sein soll. Entweder so wie oben, allerdings mit DDRx. Oder mit der CV-spezifischen (nicht ganz C-conformen, aber sehr angenehmen) Biterweiterung. DDRD.0=1; //als Ausgang PortD.0=0; ((Ausgang auf low schalten
habe das Prog soweit erweitert
#include <Mega8.h>
void main(void) {
DDRD.0=1; // Als Ausgang setzen
PORTD.0=0; // Ausgang auf low (Masse) schalten
}
kann ich das jetzt auf den Controller brennen und die LED wird
eingeschatet sein?
oder fehlt da noch was ?
@crazy horse kannst du mir da weiter helfen eventuell das progschreiben. Das die LED an PORTD0 an /aus macht. danke schon mal
Gast
#816271
das ist doch völlig sinnfrei. Du musst doch auf irgenwas reagieren, zumindest mal blinken lassen oder sowas. Soll sie nur leuchten, schliess sie doch ganz ohne Controller und Software an.
ja dann eben blinken wie muss ich das programm dann dafür schreiben etwa
so?
#include <Mega8.h>
void main(void) {
DDRD.0=1; // Als Ausgang setzen
PORTD.0=0; // Ausgang auf low (Masse) schalten LED an
PORTD.0=1 // Ausgang auf high schalten LED aus
}
kannst du mir weiterhelfen bitte
Gast
#816312
du bist ja echt penetrant :-)
Danke schön !!! sehr nett mal sehen ob es läuft...
while (1)
{PORTD.0=0;
delay_ms (500);
PORTD.1=0;
delay_ms (500);
PORTD.0=1;
PORTD.1=1;
delay_ms (500);
};
}
danke für den code aber hab da noch paar fragen... muss das nicht
PORTD.0=0;
delay_ms(500);
PORTD.0=1;
delay_ms(500);
PORTD.0=1
PORTD.0=0;
delay_ms(500);
heißen oder wieso schreibst du PORTD.1.=1 Das heißt doch PortD1 ist auf
high 5v oder nicht?
Gast
#816365
ich denke, du willst auch mit PortD.1 und PortD.2 was spielen? "PORTD.1.=1 Das heißt doch PortD1 ist auf high 5v" Genau das.
ja hab das programm jetzt in den controller geschoßen geht aber nicht wie machst du das denn einfach speicher als asm oder h. und dann bei ponyprog laden...? kann man irgendwie bei code vision eine hex datei erzeugen?
Gast
#816377
Vitalij, ist 1989 dein Geburtsjahr? Wenn ja, dann solltest du nur den WinAVR komplett runterladen und das AVR Tutorial. Dann das Internet abschalten und das Tutorial mal richtig durcharbeiten, danach wird die LED blinken. Aber nicht wenn du irgendwelches zusammengegoogeltes Zeug durcheinander wirfst.
Vitalij K. wrote: > ja hab das programm jetzt in den controller geschoßen geht aber nicht > wie machst du das denn einfach speicher als asm oder h. und dann bei > ponyprog laden...? kann man irgendwie bei code vision eine hex datei > erzeugen? Du musst in CV ein Projekt erzeugen, Deine C-Datei dem Projekt hinzufügen, unter Projekteinstellungen den korrekten Controller auswählen und dann kompilieren (fehlerfrei sach ich mal) und dann kommt die hex-Datei ganz von alleine. Und dann klappts auch mit dem Blinken ...
Ach ja, eins noch: warum hast Du es auf einmal so eilig? 19 Jahre ging es ohne CV und dann wirst Du bereits nach 10 Minuten ohne Antwort unruhig? Einfach mal diesen Thread durchsuchen, da gibt es mehrere Anfängerfragen - und auch andere - zum CV.
Danke für alle tips hab jetzt ein Programm geschrieben welches drei LED nacheinander blinken lässt: /***************************************************** This program was produced by the CodeWizardAVR V1.25.3 Professional Automatic Program Generator © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 19.03.2008 Author : Company : Comments: Chip type : ATmega8L Program type : Application Clock frequency : 4,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0x07; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; while (1) { PORTD.0=0; delay_ms (100); PORTD.0=1; PORTD.1=0; delay_ms (100); PORTD.1=1; PORTD.2=0; delay_ms (100); PORTD.2=1; }; } möchte aber jetzt über einen Taster sie wieder ausschalten können: Macht man das mit dem if-Befehl, wenn ja wäre ich für ein Beispiel sehr dankbar. ich dachte da ansowas in der art hat aber nicht geklappt if (PORTB.0=0) // Taster an PORTB.0 angeschloßen durch drücken ist PORTB.0 auf low (GND) { PORTD.0=1; //LED an PORTD.0 geht aus };
> if (PORTB.0=0)
Das ist ja auch Unsinn! Der "="-Operator ist ein Zuweisungs-Operator. Du
willst hier aber sicher keine Zuweisung, sondern einen Vergleich machen.
Dazu musst Du dann den Vergleichsoperator "==" benutzen.1 | |
2 | |
oder kürzer
1 | |
2 | |
Habe jetzt das Programm geändert um den Effekt besser zusehen. Aber das mit dem Taster die eine LED ausschalten funktioniert leider nicht mache ich was bei dem IF-Befehl falsch ? while (1) { PORTD.0=0; //LED 1 an PORTD.1=0; //LED 2 an PORTD.2=0; //LED 3 an if (PORTB.0==0) // Taster an PORTB.0 angeschloßen durch drücken ist PORTB.0 auf low (GND) { PORTD.0=1; //LED an PORTD.0 geht aus }; };
Gast
#816922
@ Vitalij K.: Hast Du den CodevisionAVR Compiler gekauft ? Gruß Sven
jap unzwar hier-> http://www.delcomp.com/codevision/download.htm kann mir denn einer weiter helfen bei meinem problem mit dem taster bzw. if-befehl
Hallo Vitalij, mit deinem Programm schaltest du die LED sehr sehr kurz aus, sodass du es nicht siehst. Gehe mal dein Programm durch und versuche doch mal nachzuvollziehen, was genau geschieht... Es wäre sicherlch sinnvoller, wenn du dich etwas in das AVR Tutorial und in die C Programmierung einliest und dann erst mit einem einfachen Programm beginnst. Grüße, Kai
@KAI Ich habe mich in AVR Tutorial eingelesen leider funktionieren die befehle bei CodeVision nicht : mein Programm macht ja nix anderes als die drei LEDs einschalten PORTD.0=0; //LED 1 an PORTD.1=0; //LED 2 an PORTD.2=0; //LED 3 an und dann wollte ich über den Taster die erste LED ausschalten in dem ich das mit dem If-Befehl vergleiche oder muss das anders geregelt werden im AVR-Tutorial wird das ja über kopieren gemacht in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen out PORTB, r16 ; Inhalt von r16 an Port B ausgeben rjmp loop ; Sprung zu "loop:" -> Endlosschleife aber wie geht das bei CodeVision ich dachte über den IF-Befehl so if (PORTB.0==0) // Taster an PORTB.0 angeschloßen durch drücken ist PORTB.0 auf low (GND) { PORTD.0=1; //LED an PORTD.0 geht aus }; BITTE um hilfe komme nicht weiter
Vitalij K. wrote: > @KAI > > und dann wollte ich über den Taster die erste LED ausschalten in dem ich > das mit dem If-Befehl vergleiche oder muss das anders geregelt Nö. Das dürfte schon stimmen. Nur was du übersiehst ist, daß dein Prozessor diese Schleife ein paar Zehntausendmal in der Sekunde abarbeitet. D.h. Wenn die Taste gedrückt ist, dann schaltet sie der nächste Schleifendurchgang gleich wieder ein, woraufhin sie das if wieder ausschaltet, usw. Deine LED blinkt also in Wirklichkeit. Rasend schnell, aber sie blinkt!
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Habe das Programm jetzt so umgeschrieben aber die erste LED geht immer noch nicht aus wo liegt der fehler? #include <mega8.h> void main(void) { DDRD= 0x07; //PORTD.0 bis PORTD.2 ist auf Ausgang gesetzt DDRB=0x00; //PORTB.0 ist auf Eingang gesetzt PORTB=0x01; //Pullup widerstnd an PORTB.0 ist an while (1) { if (PORTB.0==0) //Ist PORTB.0 auf Eingang? { PORTD.0=1; //JA dann LED1 aus } else { PORTD.0=0; //NEIN dann LED1 weiterhin an }; }; }
Gast
#817037
Du wirst ohne Kenntnis der Prozessorarchitektur und ohne wirklich ganz elementare C-Kenntnisse nicht weiterkommen. Nimm die Hinweise von allen Seiten ernst und arbeite dich durch. Damit meine ich nicht durchlesen, sondern verstehen. Mein letzter Tip in dieser Sache: willst du einen Eingang lesen, musst du das PINx-Register als Datenquelle wählen. PORTx liest immer nur das, was reingeschrieben wurde, nicht den wirklichen Eingangspegel. Also nicht if (PORTB.0==0) sondern if (PINB.0==0)
Vitalij K. wrote: > Habe das Programm jetzt so umgeschrieben aber die erste LED geht immer > noch nicht aus wo liegt der fehler? Mist. Mein Fehler. Wenn man den externen Status an einem Port abfragen will, dann macht man das über das PIN Register, nicht PORT
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
Und arbeite an deiner Quelltextformatierung! Der Stil in dem du zur Zeit schreibst ist einfach nur grauslich. Ein guter Stil hilft auch bei der Übersicht in einem Programm. Jede 2.te Zeile als Leerzeile auszuführen bewirkt nur eines: Das Programm wird völlig unnötig in die Länge gezogen.
JA wo kann ich das denn alles nachlesen im AVR-Tutorial ist ja nix auf CodeVision bezogen . Kannst du mir paar links schicken oder einbeispiel geben und erklären was was ist.....
Hallo nochmal, bist du sicher, dass überhaupt dein Programm ausgeführt wird, also z.B. deine Fuse Bits korrekt gesetzt/gelöscht sind ? Also für z.B. externe Clock ein Quarz angeschlossen ist etc ? Füge einfach mal VOR dem while(1) PORTD.0=0; delay_ms(500); PORTD.0=1; delay_ms(500); PORTD.0=0; hinzu. Wenn die LED den Zustand nicht ändert, wird dein Programm gar nicht ausgeführt... Grüße, Kai
> JA wo kann ich das denn alles nachlesen im AVR-Tutorial ist ja nix auf > CodeVision bezogen . Kannst du mir paar links schicken oder einbeispiel > geben und erklären was was ist..... AVR-GCC-Tutorial Bezieht sich zwar auf den GCC, geht aber (bis auf die Einbindung der Bibliotheken und einiger Funktionen) auch mit CodeVision.
Vitalij K. wrote: > JA wo kann ich das denn alles nachlesen im AVR-Tutorial ist ja nix auf > CodeVision bezogen . Das macht herzlich wenig. Die Prinzipien, wie ein Megaxx funktionioniert sind immer noch die Gleichen. Und soweit wirst du schon noch abstrahieren können, dass ein PORTB = ( 1 << PB0 ); einem PORTB.0 = 1; entspricht. In beiden Fällen wird das Bit 0 am Port B auf 1 gesetzt. Beim Codevision steckt das Bit 0 hier: PORTB.0 *** und beim gcc steckt es in der Syntax hier: 1 << PB0 ***
@Karl heinz Buchegger viele dank für die Hilfe nur leider funktioniert das Programm immer noch nicht die LEDs leuchten alle, jedoch geht die erste LED beim betätigen des Tasters nicht aus eine Idee warum nicht?
Vitalij K. wrote: > @Karl heinz Buchegger viele dank für die Hilfe nur leider funktioniert > das Programm immer noch nicht > > die LEDs leuchten alle, jedoch geht die erste LED beim betätigen des > Tasters nicht aus eine Idee warum nicht? Was weis ich, Verkabelung? (Dein Blinktest hat doch funktioniert, oder nicht?. Nur damit man ausschliessen kann, dass das Pgm gar nicht gebrannt wurde) Was it mit dem hier?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
Ein paar Taster am Port B an paar LED am Port D, und wenn du an den Tastern rumspielst, müsste sich auf der gleich-zahligen LED was tun. (Also LED 0 müsste auf Taster 0 reagieren, Led 1 auf Taster 1, usw.) Die Taster muessen nach Masse schalten. D.h. der Port Pin am Port B ist bei nicht gedrückten Taster auf +5V (mit Voltmeter nachmessen) und wenn die Taste gedrückt ist, dann ist der Pin auf 0V (ebenfalls mit Voltmeter nachmessen)
Hi nochmal, im Forum unter Linksammlung - Tutorials und Beispiele - C sind einige Links, es macht Sinn, dich dort durchzuarbeiten ! Kai
@ Kai Das Programm wird ausgeführt die LED veränder ihren zustand hab ich grad ausprobiert
@Vitalij Wie schon so oft gesagt, lies und verstehe das AVR-GCC-Tutolial http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Nicht jeder C-Compiler versteht den direkten Zugriff auf ein Bit à la PORTB.x=1 oder PORTB.1=0. Aber der Codevision versteht auch PORTB|=(1<<x) bzw. PORTB&=~(1<<x), wie es im AVR-GCC-Tutorium steht. Also kannst Du die Beispiele aus dem Tutorium genauso anwenden, wie sie auch drin stehen.
Hey Leute abgesehn von dem Programm mit dem Taster. Gibt es ne Möglichkeit bei dem Programm was ich für das LED-Lauflicht geschrieben habe die geschwindigkeit per Trimmer oder noch besser per Poti einzustellen. Falls ja hat einer ne idee wie man das mach hardwaremäßig und auch mit dem code: hier mein Lauflicht Programm #include <mega8.h> #include <delay.h> void main(void) { PORTD=0x00; DDRD=0x07; while (1) { PORTD.0=0; delay_ms (100); PORTD.0=1; PORTD.1=0; delay_ms (100); PORTD.1=1; PORTD.2=0; delay_ms (100); PORTD.2=1; }; }
Hmmm, ich bin sicher, dass schon mehrfach auf das AVR-GCC-Tutorial hingewiesen wurde...
Gast
#817172
ich glaube auch, dass dein Bonus nun aufgebraucht ist. Setz dich hin, mach mal was selbst. zeige, was du gemacht hast (ausser irgendwas zusammenkopiertes) und dann gehts auch mit der Hilfe weiter.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.