Forum: Mikrocontroller und Digitale Elektronik Threads mit avr


von Christian Buntrock (Gast)


Lesenswert?

Hallo.
Ich möchte eigentlich etwas recht simples schreiben nur brauche ich da
so eine Art threads (glaube ich zumindest^^).

Und zwar habe ich folgendes:
Ich habe zwei Ports. B und C. An C sind LEDS. Jetzt möchte ich wenn Pin
2 an B auf 1 gesetzt wird, das C auf 0xF0 gesetzt wird. Also das
praktisch die obere hälfte aufleuchtet. Wenn Pin 1 an B auf gesetzt
wird sol dagegen 0x0F aufleuchten. Mein Problem dabei ist, das man die
möglichkeit haben soll, wenn Pin 1 oder 2 an B auf 1 gesetzt wird, dass
man noch 250 ms sekunden zeit hat die andere seite ebenfalls auf 1 zu
setzen. also das innerhalb der 250 ms es möglich ist, Port C auf 0xFF
zu setzen. Wenn ich jetzt delay_ms nehmen würde, dann wäre das ja im
grunde eine pause in der gar nix mehr geht. ich will aber das er im
hintergrund zählt (also eben wie so eine art zusätzlicher thread) damit
man innerhalb der zeit noch auf 1 setzen kann.
ich hoffe es ist ein wenig rübergekommen was ich meine :)

programmiere mit CodeVision in C und habe das AT90S8535.
bisher habe ich folgdenden code (also ohne die 250ms geschichte...):

------------------------------
void main(void)
{

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

while (1)
      {
             if(PINB.1)
             {
                PORTC=0x0F;
                delay_ms(2500);
                PORTC=0x00;
             }

             if(PINB.2)
             {
                PORTC=0xF0;
                delay_ms(2500);
                PORTC=0x00;
             }
      };
}
------------------------------
also bis jetzt kann man also auf der einen seite 1 setzen und die ein
ehälfte wird für 2,5 sekunden eingeschaltet...


viele dank für eure hilfe!!

gruß
christian

von C. Lechner (Gast)


Lesenswert?

Das würde ich mit einem Timer lösen. Auch wenn ich jetzt nicht weis, wie
man das mit CodeVision lösen kann, das Datenblatt ist sicherlich eine
gute Anlaufstelle, denn die Register werden währscheinlich in
CodeVision auch so ähnlich heißen wie im Datenblatt.

CU
- cl

von Schoaschi (Gast)


Lesenswert?

lol :-).. hast du schon mal an schleifen und ifs gedacht?

----------------------------------
int x;
while (1)
      {
      x=1;
             if(PINB.1)
             {
                PORTC=0x0F;
                while(x<=255)
                 {
                  if(PINB.2)
                   {
                   PORTC=0xFF;
                   }
                  x++;
                  delay_ms(1);
                 }
                delay_ms(2500);
                PORTC=0x00;
             }

             if(PINB.2)
             {
                PORTC=0xF0;
                while(x<=255)
                 {
                  if(PINB.1)
                   {
                   PORTC=0xFF;
                   }
                  x++;
                  delay_ms(1);
                 }
                delay_ms(2500);
                PORTC=0x00;
             }
      }
----------------
probiers mal vl damit. ich hoffe es funktioniert.

von Christian Buntrock (Gast)


Lesenswert?

erstmal vielen dank für eure posts.
@Schoaschi: lol^^ thx. darauf hätte ich auch ma kommen sollen. habs
zwar noch nich gestet, aber sieht irgendwie total logisch aus das
ganze^^. aua das tut weh :)

werd gleich mal testen :)


thx!!!
cu

von Schoaschi (Gast)


Lesenswert?

gern geschehen :-)... hab früher auch immer die einfachsten wege
übersehen ;-)

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.