Forum: Compiler & IDEs Absoluter Einsteiger sucht hilfe


von Leo B. (luigi)


Lesenswert?

Servus beieinander,

Also ich versuche gerade mich in die Programmierung von uCs mittels C++ 
reinzuarbeiten. Dazu habe ich unter anderem die demo.h gefunden. Aber 
hier habe ich noch einige sehr viele Grundlegende fragen:
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/sleep.h>
5
6
#include "iocompat.h"
7
8
enum { UP, DOWN };
9
10
ISR (TIMER1_OVF_vect)
1.Frage: was ist ISR für eine lustige Funktion?
 Und ist TIMER1_OVF_vect nicht irgendwie ein Interrupt?
1
{
2
    static uint16_t pwm;
3
    static uint8_t direction;
4
5
    switch (direction)
6
    {
7
        case UP:
8
            if (++pwm == TIMER1_TOP)
9
                direction = DOWN;
10
            break;
11
12
        case DOWN:
13
            if (--pwm == 0)
14
                direction = UP;
15
            break;
16
    }
17
18
    OCR = pwm;
19
}
20
21
void
22
ioinit (void)
23
{
24
    /* Timer 1 is 10-bit PWM (8-bit PWM on some ATtinys). */
25
    TCCR1A = TIMER1_PWM_INIT;
2.Frage: TCCR1A ist was? und mit was wirds gleichgesetzt?
1
    /*
2
     * Start timer 1.
3
     *
4
     * NB: TCCR1A and TCCR1B could actually be the same register, so
5
     * take care to not clobber it.
6
     */
7
    TCCR1B |= TIMER1_CLOCKSOURCE;
8
    /*
9
     * Run any device-dependent timer 1 setup hook if present.
10
     */
11
#if defined(TIMER1_SETUP_HOOK)
12
    TIMER1_SETUP_HOOK();
13
#endif
14
15
    /* Set PWM value to 0. */
16
    OCR = 0;
17
18
    /* Enable OC1 as output. */
19
    DDROC = _BV (OC1);
20
21
    /* Enable timer 1 overflow interrupt. */
22
    TIMSK = _BV (TOIE1);
23
    sei ();
24
}
25
26
int
27
main (void)
3.Frage: warum kommt hier ein "int main (void)" oben aber ein "void 
ioinit (void)"? also warum int und void?
1
{
2
3
    ioinit ();
4
5
    /* loop forever, the interrupts are doing the rest */
6
7
    for (;;)
8
        sleep_mode();
9
10
    return (0);
11
}

Dazwischen sind auch noch einige Fragen aber ich hoffe ich komme 
schonmal wieder weiter wenn ich davon irgendwas lerne.
Deshalb schonmal Danke für hilfreiche Antworten.

von dummy (Gast)


Lesenswert?

>1.Frage: was ist ISR für eine lustige Funktion?
> Und ist TIMER1_OVF_vect nicht irgendwie ein Interrupt?

Ja.

>2.Frage: TCCR1A ist was? und mit was wirds gleichgesetzt?

Lies das Datenblatt zu deinem uC.

>3.Frage: warum kommt hier ein "int main (void)" oben aber ein "void
>ioinit (void)"? also warum int und void?

Besorg dir ein Buch zu C.

von Johannes M. (johnny-m)


Lesenswert?

Das ist kein C++, sondern pures C. Und zu den AVR-spezifischen 
Angelegenheiten ist das AVR-GCC-Tutorial hilfreich.

von Leo B. (luigi)


Angehängte Dateien:

Lesenswert?

OK. Dickes Danke an alle Helfer! Mit eurer Hilfe bin ich ziemlich weit 
gekommen denke ich.

Jetz bräuchte ich zwar noch jemanden der mein Programm prüft, aber ich 
denke das ist zu viel. (Ich muss ja leider noch auf mein STK 500 warten 
(doofes eGay).

Trotzdem werde ich es mal anhängen, sowie meinen geplanten Schaltplan.
Evtl. hat ja jemand lange Weile und schaut mal drüber.
Ich schätzte es werden schon noch sehr viele böse Fehler drin sein, aber 
so ist das halt beim ersten richtigen Versuch. (lauflichter und ne 
kleine PWM hab ich ja schon gemeistert ^^)


Ah ja kleine Beschreibung vielleicht noch:
Das ganze soll so ein Verrücktes Wählscheiben-Handy werden.
Dabei gibts erstmal 3(4) Taster. 2 in der Wählscheibe und einer (bzw. 2 
gleichzeitg schaltende) beim Auflegen des Hörers.
Ein Hörerschalter ist S1, der andere S4. Beide Trennen beim Auflegen des 
Hörers.
Die Wählscheibe bedient S2 und S3. Dabei schließt S2 wenn die 
Wählscheibe aus der Ruhestellung gedreht wird, und S3 öffnet beim 
zurrücklaufen lassen für jede Zahl einmal. (Bsp. Zahl 9 wird eingegeben 
-> S3 öffnet 9 mal)

Zum Schaltplan: S4 soll erstmal ein Einschalter sein, der uC soll dann 
später einmal ausschalten können. Den Quarz (4MHz) hab ich im Schaltplan 
erst mal weggelassen. Der macht die Ecke da immer noch unübersichtlicher 
bei mir.
IC1: AT90s2313 @ 4MHz
IC2: 4066
IC3: 4066
Die 4066 bedienen dann die Tastenmatrix der Handytastatur.
Vorerst bringt mich diese Schaltung mal ans Ziel und wird daher auch 
verwendet.

Code folgt...

von Leo B. (luigi)


Angehängte Dateien:

Lesenswert?

Hier noch mein Programm, welches mal auf den AT90s2313 soll.

Kleine Erläuterung noch:
Plan ist dass ein der Timer/Counter 0 im achtel Clock-takt zählt. Also 
4MHz/8 = 500kHz.
dieser löst bei jedem überlauf (alle 256 Zähltakte) einen Interrupt aus, 
und in diesem läuft dann das eigentliche Programm ab. Ist der uC mit 
seinem Interrupt fertig soll er in den sleepmodus gehen um Akku zu 
Sparen. (später soll er einmal ganz abschalten / PD0 ausschalten. )

Da der Interrupt also nur 1 / ( 500kHz / 256 ) = 0,000512 s = 0,5ms 
ausgelöst wird, denke ich bekomme ich auch keine Probleme mit dem 
prellen der Taster.

Ach ja fast vergessen. Ich benutze nur globale Variablen. Dann hab ich 
erstmal keine Probleme mit evtl. fehlenden Werten in anderen Funktionen 
oder sowas für Anfänger schwer überschaubares.

Zur funktionsweise des fertigen Telefons:
Man habt den Hörer ab. Dadurch wird der uC ggf. eingeschaltet. Dann kann 
man am Rad drehen. Wenn das Rad wieder in Ausgangslage ist, wird die 
entsprechende Handy-Taste durch die Funktion key() "gedrückt". Einige 
Interrupts später wird die Taste wieder durch key() losgelassen. 
Parallel zum Tastendruck soll die Kontroll-LED leuchten.
Wenn man fertig ist mit Wählen drückt man unter eine Sekunde lang auf 
den auflegen-Schalter und das Handy beginnt hoffentlich zu wählen.
Ich glaube mit meinen Kommentaren versteht man meinen Gedankengang beim 
schreiben des Programms.

So der Plan.
Ich hoffe man kann jetzt verstehen was ich vor habe.
Viel Spaß beim grübeln.

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.