Forum: Mikrocontroller und Digitale Elektronik Am PortB binär ausgeben mit C


von Anfänger (Gast)


Lesenswert?

Hallo !

um meine R/2R Netz zu testen habe ich in CodeVision so ein Prog 
geschrieben. Es sollte ne Rampe darstellen und das macht das Prog auch, 
aber die Rampe hat 5 grössere Treppen. Ich denke es liegt an Befehl den 
ich verwende DDRB=.... Das eigentlich wie ich glaube nur für 
Initialisierung benutz wird und nicht zur Ausgabe.

#include <mega16.h>

unsigned int i;

void main(void)
{
while (1)
      {

      for (i=256; i > 0; i--)
        {
          DDRB=i;
        };
      };
}




Ich habe das ganze noch mit asm Programm getestet:

.INCLUDE "m16def.inc"

; Register Definitionen
;
.DEF rmp = R16 ; Multipurpose Register
;
  ldi rmp,0xFF;  Alle Pins von Port B als Ausgang
  out DDRB,rmp ; in Datenrichtungsregister
sawtooth:
  out PORTB,rmp ; Inhalt von rmp an Port B ausgeben
  inc rmp ; erhöhen
  rjmp sawtooth ; und weiter fuer immer

und meine Rampe sieht da gerade aus.

In asm Programiere ich aber nicht und würde wie man Zahlen am Port 
ausgibt.
Danke !

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>for (i=256; i > 0; i--)
>        {
>          DDRB=i;
>        };

PORT != DDR
An einem acht Bit breiten Port kannst du keine 256 ausgeben.

von Dirk D. (dirkd)


Lesenswert?

Hi,

in Deinem Ass. steht doch auch

 out DDRB,rmp ; in Datenrichtungsregister
sawtooth:
  out PORTB,rmp

Also erst Datenrichtung setzen

DDRB = 0xFF;

Dann in der Schleife die Ausgabe

PORTB = i;

von Anfänger (Gast)


Lesenswert?

Ja ich weis,
und wie gebe ich dann z.B. 255 aus ?

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

PORTB = 255;

von Anfänger (Gast)


Lesenswert?

Gut ! Danke!

von Anfänger (Gast)


Lesenswert?

Also hab eben ausprobiert so geht das nicht, nur gleichspannung raus :)


#include <mega16.h>

unsigned int i;

void main(void)
{
while (1)
      {

      for (i=255; i > 0; i--)
        {
          PORTB=i;
        };
      };
}

von Dirk D. (dirkd)


Lesenswert?

Und wo ist Dein DDRB geblieben?

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>unsigned int i;


unsigned char reicht.

>#include <mega16.h>

Sofern es sich sich um den avr-gcc handelt, sollte man AFAIR die 
"avr/io.h" einbeziehen.

Hast du schon einen Blick ins avr-ggg-Tutorium geworfen?
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Anfänger (Gast)


Lesenswert?

wo muss DDRB denn hin in die Schleife rein ?

Ich nutze CodeVision da habe ich jetzt

#include <io.h>
#include <stdio.h>
mal reingenommen

geht nicht :(

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nicht in, sondern vor die Schleife muss ein Zugriff auf DDRB, damit 
nämlich der PortB als Ausgang konfiguriert wird.

von Dirk D. (dirkd)


Lesenswert?

DDRB konfiguriert den Port

PORTB macht eine Ausgabe auf dem PORT

PINB ist zum Einlesen des Ports gedacht

Du mußt Dich nur an das Asm-Prog halten oder machen was ich geschrieben 
habe:

> Also erst Datenrichtung setzen
> DDRB = 0xFF;

> Dann in der Schleife die Ausgabe
> PORTB = i;


von Anfänger (Gast)


Lesenswert?

Jetzt geht's!!!

Ich habe vorhin DDRB auf 0 gesetzt :)))es sollte aber auf FF sein.

Danke !

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.