Forum: Mikrocontroller und Digitale Elektronik avr einsteiger


von Patrick R. (regatoni)


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

von Klaus T. (gauchi)


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)

von Ghast (Gast)


Lesenswert?

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

Wenn dann:
PORTB = 0xff;

von Klaus T. (gauchi)


Lesenswert?

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

Was sind denn 'seltsame sachen' ?

von Patrick R. (regatoni)


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

von Patrick R. (regatoni)


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

von Karl H. (kbuchegg)


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?

von Patrick R. (regatoni)


Lesenswert?

vom simulator

von Patrick R. (regatoni)


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;
}

von Patrick R. (regatoni)


Lesenswert?

achso ... wenn ich breakpoints setzte gehts auch ...

von Karl H. (kbuchegg)


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.

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.