Forum: Mikrocontroller und Digitale Elektronik C Eingabe Ausgabe frage


von Martin X. (martin007)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Was hast du denn installiert und was wie aufgerufen?
Auf welchem System?

von Stefan E. (sternst)


Lesenswert?

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

von Martin X. (martin007)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Martin X. schrieb:

> Software SiSy für Win

Haben die einen eigenen Compiler? Dann vergiss meinen Post, ich war vom 
avr-gcc ausgegangen.

von Silvan K. (silvan) Benutzerseite


Lesenswert?

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?

von Martin X. (martin007)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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).

von Martin X. (martin007)


Lesenswert?

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

von Mark .. (mork)


Lesenswert?

@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.

von Martin X. (martin007)


Lesenswert?

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

von Martin X. (martin007)


Lesenswert?

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

von Mark .. (mork)


Lesenswert?

@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

von Martin X. (martin007)


Lesenswert?

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

von Martin X. (martin007)


Lesenswert?

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
Noch kein Account? Hier anmelden.