Programmieren mit CodeVisionAVR

#816161
Lesenswert?

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
Gast #816194
Lesenswert?

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.
#816206
Lesenswert?

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
Gast #816222
Lesenswert?

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
Gast #816271
Lesenswert?

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.
#816359
Lesenswert?

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 #816377
Lesenswert?

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.
#816470
Lesenswert?

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 
...
#816861
Lesenswert?

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

      };
#816906
Lesenswert?

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

      };



      };
#816937
Lesenswert?

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
#816970
Lesenswert?

@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
#816979
Lesenswert?

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
int main()
2
{
3
  DDRD = 0x07;
4

5
  DDRB = 0x00;
6
  PORTB = 0x01;     // Pullup Widerstand an PB0 einschalten
7

8
  while (1)
9
  {
10
    if( PORTB.0 == 0 )  // Ist Taste1 gedrückt ?
11
      PORTD.0 = 1;      // Ja: LED 1 aus
12
    else
13
      PORTD.0 = 0;      // Nein: LED 1 an
14
  }
15
}
#817014
Lesenswert?

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
Lesenswert?

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)
#817052
Lesenswert?

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
void main(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.
#817055
Lesenswert?

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
#817058
Lesenswert?

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
                                                 ***
#817066
Lesenswert?

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
void main(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)
Persönliche Seite #817075
Lesenswert?

@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.
#817146
Lesenswert?

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;
      };
}
Gast #817172
Lesenswert?

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.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren