mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Module initialisieren


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe mal eine Frage wie ihr eure Module initialisert (z.b. einen 
Timer).
ich habe eine main.c, in der der eigentliche Code geschrieben wird. Für 
die einezelnen Module mache ich auch eine .c und eine .h (z.B. timer.c 
/.h)

Wie initialisiert ihr eure module? Was gibt seht ihr als 
vorteil/Nachteil?


reine initialisierung in timer.c
int main(void)
{
timer0_init();
...
timer.c
void timer0_init()
{
  TCCR0A |= (1 << WGM01); // CTC-Mode
  TCCR0B |= (1 << CS00) | (1 << CS01); // clkI/O/64
  OCR0A = (250 - 1);
  TIMSK0 |= (1 << OCIE0A);
  TCNT0 |= 0;
}


oder mit Adressen vom Register aus der main-funktion mit übergeben)
main.c
int main(void)
{
  timer0_init(&TCCR0A,  ~(1 << WGM00) | (1 << WGM01),
            &TCCR0B,  ((1 << CS00) | (1 << CS01)) & ~(1 << CS02),
            &OCR0A,   (250 - 1),
            &TIMSK0,  (1 << OCIE0A),
            &TCNT0, 0);
...

timer.c
void timer0_init(volatile uint8_t* tccra, uint8_t tccraNewState,
            volatile uint8_t* tccrb, uint8_t tccrbNewState,
            volatile uint8_t* ocra, uint8_t ocraNewState,
            volatile uint8_t* timsk, uint8_t timskNewState,
            volatile uint8_t* tcnt, uint8_t tcntNewState)
{
   *tccra |= tccraNewState;
   *tccrb |= tccrbNewState;
   *ocra |= ocraNewState;
   *timsk |= timskNewState;
   *tcnt = 0;
}

Gruß
Frank

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Die Frage ist hier Unsinn. Da werden jetzt 20 Leute antworten, dabei 30 
Meinungen vertreten und sich gegenseitig als Idioten bezeichnen. Warte 
nur ab.

: Bearbeitet durch User
Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Würde man einen AVR betrachten, was sind den "Module"?

Wo finde ich den Begriff?

Autor: derjaeger (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Wenn man einen hardwareunabhaengigen Ansatz verfolgen würde, dann gebe 
es sowas wie "Timer 0" usw. nicht. Es gebe dann z.B. einen "1ms-Timer" 
der initialisiert wird. Wie der 1ms Timer arbeitet und initalisiert 
spielt keine Rolle hauptsache der Name ist gerechtfertigt.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Die Frage ist hier Unsinn. Da werden jetzt 20 Leute antworten, dabei 30
> Meinungen vertreten und sich gegenseitig als Idioten bezeichnen. Warte
> nur ab.

Dadurch da ich noch nicht allzu lange programmiere, wollte ich einfach 
mal fragen, wie man sowas am besten macht.


Karl M. schrieb:
> Würde man einen AVR betrachten, was sind den "Module"?

Nun ja, ich meinte damit die "Peripheral Features" (wie auch immer man 
das genau ins deutsche übersetzt). Aber ich denke, ich habe erläutert 
was ich damit meinte. Also z.B. den Timer oder Uart

derjaeger schrieb:
> Es gebe dann z.B. einen "1ms-Timer"
> der initialisiert wird.

Mhh, dass ist gut, dass könnte ich auch so machen.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> Dadurch da ich noch nicht allzu lange programmiere, wollte ich einfach
> mal fragen, wie man sowas am besten macht.

Ich denke, dass derjaeger vernünftig geantwortet hat. In der 
Softwareentwicklung gibt es Leute, die wollen ihre Programmteile modular 
(austauschbar) machen und möglichst hardware-unabhängig machen.

Das ist aber bei Dingen, die gerade der Ansteuerung von Hardware dienen 
kaum möglich und sinnvoll, da diese Herangehensweise oft mit einem 
gewaltigen Overhead verbunden ist, der den Speicherbedarf erhöht und die 
Leistung verringert.

Die ersten Schwierigkeiten, auf die du stoßen wirst sind wahrscheinlich 
folgende:

1) Interrupthandler sind fest C Funktionen zugeordnet weil die 
Interrupt-Vektor Tabelle im Flash (nicht im Ram) liegt. Es sei denn, du 
baust für jeden Interrupt einen Wrapper in C, der an die eigentlichen 
austauschbaren Module/Objekte vermittelt.

2) Die mehrfach vorhandenen Peripherien (z.B. Timer, serielle Ports, PWM 
Kanäle) sind nicht identisch und nicht völlig unabhängig voneinander 
konfigurierbar.

3) Die Register der mehrfach vorhandenen Peripherie liegen nicht immer 
in der gleichen Reihenfolge und mit gleichen Abständen zueinander im 
Adressraum, weswegen man sie nicht als Struct darstellen kann. Das ist 
mir besonders bei AVR aufgefallen.

Bei den Xmega hat Atmel die Punkte 2) und 3) besser gemacht, es soll 
jetzt wohl auch neue ATtinies geben, die in dieser Hinsicht besser sind. 
Nur sind die aufgrund ihrer Bauform, Verfügbarkeit und fehlender 
Bastelanleitungen für Hobbyelektroniker (noch) kaum relevant.

Mache Dir darüber nicht so viele Gedanken. Mikrocontroller Projekte sind 
(verglichen mit Enterprise Anwendungen) in der Regel überschaubar. Da 
braucht man keine Module für die hardwarenahen Sachen. Ich persönliche 
komme mit kommentierten Code-Schnipseln gut klar. Die kopiere ich immer 
wieder von Projekt zu Projekt und passe sie den jeweiligen Bedürfnissen 
an.

Wenn du mal konkrete Beispiele sehen willst, wie man das Ganze Modular 
angehen kann, dann schau Dir die Quelltexte von Arduino an. Dort haben 
Sie einige Sachen elegant gelöst, manches ist aber auch fragwürdig. Die 
entsprechenden Stellen werden auch Dir als Anfänger schnell auffallen. 
Danach kannst Du Dir deine eigene Meinung bilden.

Bei Arduino gibt es z.B. die allgegenwärtige digitalWrite() Funktion, 
die mehr als 50 Takte benötigt, um einen einzelnen I/O Pin auf High oder 
Low zu schalten. Da kommt man selbst als Anfänger schon ins grübeln - 
spätestens dann, wenn man ein LC-Diplay mit 7 Pins ansteuern will und 
sich fragt, ob da jetzt wirklich jeder Zugriff 7x50 Taktzyklen benötigen 
muss.

Einige Sachen haben die aber auch sehr gut gelöst, finde ich.

Schau Dir auch mal ein Cube-HAL Projekt für STM32 an. Da benötigt ein 
simples Hello-World Programm bereits etwa 5 Kilobytes. Das ist der 
Preis, denn man für (meiner Meinung nach) zu viel Modularität bezahlt. 
Die haben da eine API geschaffen, mit der sie alle STM32 Modelle 
abdecken wollen und schleppen daher einen gewaltigen Overhead mit sich. 
Dennoch vereinfacht die HAL das Programmieren nicht. Du musst trotzdem 
die Bits der ganzen Register einzeln kennen lernen und die Hinweise 
bezüglich deren Nutzung lesen.

Jetzt stelle Dir mal vor, du will so ein Hello-World Programm noch 
universeller machen, dass es nicht nur auf STM32 läuft. Dann wird das so 
groß, dass es auf die kleinen AVR's gar nicht mehr drauf passt.

Ich kann jetzt schon den Einen oder Anderen beeindrucken, dass meine 
Programme mit 1MHz genau so gut laufen, wie seine mit 32Mhz. Der 
Unterschied ist: Er benutzt Frameworks, ich tu das nur, wenn ich muss. 
Die gleiche Nummer wiederholt sich auch bei der Programmierung von PC's 
in jeder beliebigen Programmiersprache.

Ich nehme an, dass sich der c-hater bald meldet. Der kennt diese 
Thematik auch und hat dazu eine starke Meinung. Lies Dir ruhig durch, 
was er schreibt und denke darüber nach. Nur lass Dir nicht die 
Programmiersprache madig machen, an diesem Punkt übertreibt er gerne 
maßlos.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.