Forum: Mikrocontroller und Digitale Elektronik Umstieg PIC -> AVR


von Anita (Gast)


Lesenswert?

Hallo

Ich versuch mich gerade an meinem ersten Programm für AVRs bzw. möchte 
ein bestehendes PIC Programm umschreiben. Kann mir vielleicht jemand 
erklären, wie folgende 2 Zeilen auf AVR programmiert werden:

#define LED     LATBbits.LATB5
#define SCHALTER  PORTBbits.RB2


danke
Anita

von Matthias L. (Gast)


Lesenswert?

Genauso. Das ist ja nicht Programmiert, sondern nur definiert.

Interessanter ist der Teil des Codes, indem dieses benützt ist..

von Johannes V. (johannes_v)


Lesenswert?

Vielleicht mal im Datenblatt des entsprechenden Chips nachlesen? IDR. 
werden die Register in den Header Dateien exakt so genannt.

Müsste aber so inder Art heissen, ohne jemals ein PIC Datenblatt gesehen 
zu haben:

PORTBDIR |= (1 << 5)  // direction pin 5 output
PORTBDIR &= ~(1 << 2) // pin 2 as input

Wenn noch ein Pullup benötigt wird muss der evtl. auch noch in einem 
weiteren Register geschaltet werden.

von (prx) A. K. (prx)


Lesenswert?

Anita schrieb:

> Ich versuch mich gerade an meinem ersten Programm für AVRs bzw. möchte
> ein bestehendes PIC Programm umschreiben. Kann mir vielleicht jemand
> erklären, wie folgende 2 Zeilen auf AVR programmiert werden:

Das exakte Äquivalent dazu ist Handarbeit, da es für AVRs meist keine 
fertigen Bitfelder für Portzugriff gibt, jedenfalls nicht von Atmel. Was 
man ändern kann, aber das darf man dann eben selber machen.

Die bei AVRs übliche Methode ist im Tutorial beschrieben:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
Dran denken, dass die Richtungssteuerung bei PICs grad andersrum läuft 
wie überall sonst.

von Anita (Gast)


Lesenswert?

bei den PICs konnte ich Pins einfach so wie oben definieren und konnte 
dann im Programm z.B. einfach die Led einschalten mittels:

LED=1;

oder über den Schalter steuern:

if (SCHALTER==1){
   LED=1;
}else{
   LED=0;
}


hab im AVR Studio verschiedens probiert, z.B.:
#define LED PIND5

funktioniert hat aber bislang nichts...

von (prx) A. K. (prx)


Lesenswert?

Lies das erwähnte Tutorial. Steht alles drin.
Im Blindflug gehts mit Sicherheit nicht.

von Anja (Gast)


Lesenswert?

probiers mal so:
1
    typedef struct
2
  {
3
     volatile bool B0: 1;
4
     volatile bool B1: 1;
5
     volatile bool B2: 1;
6
     volatile bool B3: 1;
7
     volatile bool B4: 1;
8
     volatile bool B5: 1;
9
     volatile bool B6: 1;
10
     volatile bool B7: 1;
11
  } Bits;
12
13
14
    #define LED (*(Bits *)(&PORTD)).B5

Gruß Anja

von Anita (Gast)


Lesenswert?

Anja schrieb:
> probiers mal so:

hab ich grad getesten (danke schon mal)

wenn "LED" nach der Definintion im Hauptprogramm aufgerufen wird, 
bekomme ich beim Kompilieren folgenden Fehler:

'Bits' has no member named 'B5'

von Anja (Gast)


Lesenswert?

Anita schrieb:
> 'Bits' has no member named 'B5'

Hast Du den Header vom Prozessor eingebunden?

#include <avr/io.h>          /* Prozessorpins                       */


Gruß Anja

von Anja (Gast)


Lesenswert?

ggf. fehlt auch noch ein

    typedef uint8          bool;


Gruß Anja

von gaast (Gast)


Lesenswert?

AVR-GCC Tutorial durcharbeiten. Ganz. Dann weißt du auch, wie man auf 
einem AVR Pins anspricht, und noch vieles mehr, z.B. warum man nicht 
einfach im Blindflug Registernamen ersetzen kann, um ein Programm auf 
eine andere Plattform zu portieren.

von Peter D. (peda)


Lesenswert?

Die Definition einzelner Pins geht beim AVR-GCC etwas anders:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=67368&start=all


Peter

von Anja (Gast)


Lesenswert?

Viele Wege führen nach Rom:

so gehts auch:
die compiler-Fehlermeldung liegt am im Gnu-C standardmäßig nicht 
vorhandenen "bool"
1
#include <avr/io.h>          /* Prozessorpins                       */
2
#include <inttypes.h>
3
4
typedef uint8_t   bool;    /* oder auch: typedef unsigned char bool; */
5
typedef struct
6
{
7
    volatile bool B0: 1;
8
    volatile bool B1: 1;
9
    volatile bool B2: 1;
10
    volatile bool B3: 1;
11
    volatile bool B4: 1;
12
    volatile bool B5: 1;
13
    volatile bool B6: 1;
14
    volatile bool B7: 1;
15
} Bits;
16
17
18
#define LED      (*(Bits *)(&PORTD)).B5
19
#define SCHALTER (*(Bits *)(&PINB)).B0
20
21
int main()
22
{
23
    DDRB  = 0x00; /* input   */
24
    PORTB = 0xFF; /* pull-up */
25
26
    DDRD  = 0xFF; /* output  */
27
    PORTD = 0x00; /* low     */
28
29
    LED = 1;
30
31
    if (SCHALTER==1)
32
    {
33
       LED=1;
34
    }
35
    else
36
    {
37
       LED=0;
38
    }
39
}

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.