www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C Eingabe Ausgabe frage


Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hast du denn installiert und was wie aufgerufen?
Auf welchem System?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin X. schrieb:

> Software SiSy für Win

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

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin
>Was muß ich blöd gesagt schreiben ich kenne das von assambler.

    ...
    while(1)
    {
        if(PIND & (1<<2))
            PORTB = 0x7; // 0b00000111
        else
            PORTB = 0;
    }
    ...

Das entspricht Deinem Assembler-Code.

MfG Mark

EDIT: wdt_reset(); muss natürlich auch noch rein.

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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
#define   F_CPU   3686400
#include <avr\io.h>
#include <util\delay.h>


//------------------------------------------------------------------------
// Initialisierungen
//------------------------------------------------------------------------
void init()
{
   // Ports initialisieren
   sbi(DDRB,0);   // PORTB0 auf Ausgang
   sbi(DDRB,1);   // PORTB1 auf Ausgang
   cbi(DDRD,2);   // PORTD2 auf Eingang mit PullUp
   sbi(PORTD,2);
   cbi(DDRD,3);   // PORTD2 auf Eingang mit PullUp
   sbi(PORTD,3);
}

/////////////////////////////////////////////////////////////////////////////
// Main-Funktion
/////////////////////////////////////////////////////////////////////////////
main()
{
   init();   // Initialisierungen
  while(1)
    {
        if(PIND & (1<<2) | PIND & (1<<3))
           // DDRB |= Bit0; // LED einschalten 
                 _delay_ms(100) ;
            PORTB = 0x1; // 0b00000001
              else
           // cbi PORTB =2 ;   // LED ausschalten
           PORTB = 0;
    }
  // Mainloop-Begin
   {
   //...
   } // Mainloop-Ende
}
//---------------------------------------------------------------------------

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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin X. (martin007)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.