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
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
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
PORTB|=0x07;
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
PORTB&=~0x03;
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?
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 ?
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
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?
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?
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.
> 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.
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
};
};
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
intmain()
2
{
3
DDRD=0x07;
4
5
DDRB=0x00;
6
PORTB=0x01;// Pullup Widerstand an PB0 einschalten
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
};
};
}
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
#include<mega8.h>
2
3
voidmain(void)
4
{
5
DDRD=0x07;//PORTD.0 bis PORTD.2 ist auf Ausgang gesetzt
6
7
DDRB=0x00;//PORTB.0 ist auf Eingang gesetzt
8
PORTB=0x01;//Pullup widerstnd an PORTB.0 ist an
9
10
while(1)
11
{
12
if(PINB.0==0)//Ist PORTB.0 auf Eingang?
13
{
14
PORTD.0=1;//JA dann LED1 aus
15
}
16
else
17
{
18
PORTD.0=0;//NEIN dann LED1 weiterhin an
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
#include<mega8.h>
2
3
voidmain(void)
4
{
5
DDRD=0xFF;
6
DDRB=0x00;
7
PORTB=0xFF;
8
9
while(1)
10
{
11
PORTD=PINB;
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)
@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;
};
}
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.