avr einsteiger

OP #1849602
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
OP #1849737
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...
OP #1849795
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...
#1849818
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?
OP #1849887
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;
}
#1849914
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

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