www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik avr einsteiger


Autor: Patrick Rieger (regatoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte mal ein einfaches Testprogramm schreiben.
anscheinend ist das aber nicht so einfach.

#include <avr/io.h>

int main (void)
{
   unsigned char temp;
   unsigned char temp2;

   DDRB  = 0xff;             // Alle bits an Port B sind ausgänge
   PORTB = 0xff;             // Alle Bits aktiv high (1)

   DDRA = 0x00;
   PORTA = 0xff;

   temp=PINA;
   temp2=0;

   PINB=0x01; // Dieser Befehl hat z.b. keine auswirkung

   while(1)
   {
     if(PINA!=temp)
   {
       temp=PINA;
     temp2++;
     if(temp2%2==0)
     {
         PINB=0xff;  //hat auch keine auswirkung
     }
     else
         PINB=0x00;  //hat auch keine auswirkung
   }
   }

   /* wird nie erreicht */
   return 0;
}

wieso wird an port B nix ausgegeben?
Außerdem kann ich das Programm auch nur im Einzelschrittverfahren(F11 
drücken) betreiben.
wenn ich in avr studio auf RUN drücke passieren seltsame sachen... und 
er verhält sich nicht wie bei den einzelnen Schritten.


MfG P. Rieger

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die I/Os werden über die PORTx Register gesetzt und über die PINx 
Register gelesen. Ob schreiben von PINx etwas ändert, hängt von deinem 
Controller ab (der hier aber nicht erwähnt wird)

Autor: Ghast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Rieger schrieb:
> PINB=0xff;  //hat auch keine auswirkung

Wenn dann:
PORTB = 0xff;

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Rieger schrieb:
> wenn ich in avr studio auf RUN drücke passieren seltsame sachen... und

Was sind denn 'seltsame sachen' ?

Autor: Patrick Rieger (regatoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich in dem stk500 steck ein atmega 8515L da es den bei avr studio 
aber nicht gibt habe ich den ohne L genommen.

achso. ich dachte eigentlich das über PORTx nur die pullups 
eingeschaltet werden ...


komische sachen sind:

wenn ich an auf den eingang von porta ein signal gebe, hat das keine 
auswirkung... wenn ich dann den port b beobachte und dann wieder zurück 
auf port a gehe, ist meine eingabe auch wieder verschwunden...


außerdem dauert es extrem lang bis er das kästchen überhaupt als 
ausgefüllt anzeigt...

Autor: Patrick Rieger (regatoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochma zu den komischen sachen ...

#include <avr/io.h>

int main (void)
{
   unsigned char temp;
   unsigned char temp2;

   DDRB  = 0xff;             // Alle bits an Port B sind ausgänge
   PORTB = 0x00;             // Alle Bits aktiv high (1)

   DDRA = 0x00;              // Alle bits an Port B sind eingäne
   PORTA = 0x00;

   temp=PINA;
   temp2=0;

   PORTB=0x01;  //    !!*a*!!

   while(1)
   {
     if(PINA!=temp)
   {
       temp=PINA;
     temp2++;
     if(temp2%2==0)
     {
         PORTB=0xff;
     }
     else
         PORTB=0x00;
   }
   }

   /* wird nie erreicht */
   return 0;
}


also im einzelbetrieb funktionier das ...
am anfang hat der port b den wert 0x01
... bei jeder änderung an porta wechselt der port b zwischen 0x00 und 
0xff

wenn ich RUN drücke tut sicht nichts ... an port b ist dauerhaft 0x00

dabei sollte er doch wenigstens den wert 0x01 (wegen !!*a*!!) anzeigen 
ohne das ich an port a was geändert habe...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Rieger schrieb:
> also ich in dem stk500 steck ein atmega 8515L da es den bei avr studio
> aber nicht gibt habe ich den ohne L genommen.
>
> achso. ich dachte eigentlich das über PORTx nur die pullups
> eingeschaltet werden ...

Dann solltest du nochmal die Tutorien studieren.

AVR-GCC-Tutorial
AVR-Tutorial

Auch wenn letzteres ein Assembler Tutorial ist, so findet sich doch in 
den generellen Beschreibungen (in dem Fall I/O) so manches, was auch für 
einen C-Programmierer interessant ist.

> komische sachen sind:
>
> wenn ich an auf den eingang von porta ein signal gebe, hat das keine
> auswirkung... wenn ich dann den port b beobachte und dann wieder zurück
> auf port a gehe, ist meine eingabe auch wieder verschwunden...
>
>
> außerdem dauert es extrem lang bis er das kästchen überhaupt als
> ausgefüllt anzeigt...


Redest du vom Simulator oder vom realen Chip?

Autor: Patrick Rieger (regatoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vom simulator

Autor: Patrick Rieger (regatoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann mir absolut nicht erklären wieso das nicht geht.
weils mit einzelnen schritten funktioniert!

wenn da nen fehler drin wär dann müsste das doch weder mit einzelnen 
schritten noch mit RUN laufen ....

nochma n noch einfacheres beispiel das auch nur mit einzelschritten 
geht...

#include <avr/io.h>

int main (void)
{
   unsigned char temp;

   PORTB = 0x00;             // Alle Bits sind inaktiv
   DDRB  = 0xff;             // Alle bits an Port B sind ausgänge


   PORTA = 0xff;       // interne pullups an
   DDRA = 0x00;              // Alle bits an Port A sind eingäne


   temp=PINA;    //startwert von Pin a speichern


   PORTB=0x01;     //startwert an PORTB ausgeben ( GEHT NICHT )

   while(1)
   {
     if(PINA!=temp)   //wenn sich was geändert hat
   {
       temp=PINA;   //neuen zustand speichern
       PORTB=PINA;  // Zustand von Pin a an Port B ( GEHT NICHT )
   }

   }

   /* wird nie erreicht */
   return 0;
}

Autor: Patrick Rieger (regatoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso ... wenn ich breakpoints setzte gehts auch ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Rieger schrieb:

> wenn da nen fehler drin wär dann müsste das doch weder mit einzelnen
> schritten noch mit RUN laufen ....

Wenn du den Simulator mit RUN laufen lässt, dann vernachlässigt der 
seine GUI. Sprich die GUI Updates erfolgen nur noch ab und an.

Reib dich doch nicht am Simualtor auf.
Den benutzt man sowieso nicht um sein Programm einfach frei darin laufen 
zu lassen, und dann auf die Port-Kästchen zu klicken.

Entscheidend ist deine reale Hardware. Mit dem Simulator klärt man nur 
einzelne Dinge ab, für die man dann in Einzelschrittweise die 
betreffenden Codestellen durchgeht. Und den (uninteressanten) Rest lässt 
man vom Simulator im schnellen Vorlauf zwar durchackern, aber es ist 
völlig wurscht ob der seine GUI sofort updatet oder abfragt. Beim 
nächsten Breakpoint ist früh genug.

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.