Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe bei Grundlagen: 16-Segment Anzeige


von M. K. (theother)


Lesenswert?

Guten Tag!
und zwar möchte ich gerne AVR programmieren lernen und hab mir aus 
diesem Grund ein Buch gekauft. Nun habe ich mich bis zum Kapitel 
16-Segment Anzeige eingelesen, doch jetzt kommen die ersten Fragen auf, 
die ich allein nicht mehr lösen kann.

und zwar steht im Buch ein Code zu 'Ansteuerung' einer solchen Anzeige, 
aber verstehe einige Stellen nicht, werde diese im Code dazu 
kommentieren. Würde mich freuen, wenn mir das jemand erklären könnte.
1
const char text[] = "++ HELLO WORLD! WIE GEHT'S? **"; //wie wird das abgespeichert? jedes Zeichen extra? also text[4]='E'?
2
3
void char_out (uint8_t zeichen) //wieso steht das so, und nicht im Hauptprogramm?
4
{
5
    PORTB=sign[zeichen-32]:  //welchen Wert hat ''zeichen"?
6
    PORTC=(sign[zeichen-32]>>8);
7
}
8
9
int main()
10
{
11
    int8_t i;
12
    
13
    DDRB = 0xFF;
14
    DDRC = 0xFF;
15
    
16
    for(i=0;i<=58;i++)
17
    {
18
        PORTB = sign[i];     
19
        PORTC = (sign[i] >> 8); //was mach das? was bringt es mir?
20
        delay_ms(800);
21
    }
22
    
23
    char_out ('M');  // was macht dieser Befehl? denn der uC weiß ja nicht wie ich meine
24
                            // Anzeige angeschlossen habe.
25
    delay_ms(5000);
26
    
27
    while(1)
28
    {
29
        i=0;
30
        while(text[i]!=0)
31
        {
32
            char_out (text[i]);
33
            delay_ms(700);
34
            i++;
35
            PORTB=0;
36
            PORTC=0;
37
            delay_ms(50);
38
        }
39
            
40
    }
41
}



Ich komme mir gerade extrem dumm vor, da ich kaum etwas verstehe, aber 
im Buch waren vorher nur ganz grundlegende Dinge wie Bit setzen, löschen 
und invertieren erklärt und auf einmal so ein Beispiel.

Danke im Vorraus!
mit freundlichen Grüßen,
    MK

von Linx (Gast)


Lesenswert?

Das sind größtenteils alles Funktionen:
http://www.c-howto.de/tutorial-funktionen.html

> char text[] = "++ HELLO WORLD! WIE GEHT'S? **";
ja zeichenweise

>void char_out (uint8_t zeichen) //wieso steht das so, und nicht im 
>Hauptprogramm?
>{
>    PORTB=sign[zeichen-32]:  //welchen Wert hat ''zeichen"?
>    PORTC=(sign[zeichen-32]>>8);
>}

Das ist eine Funktion. Zeichen hat den Wert den du hier

>  char_out ('M');  // was macht dieser Befehl? denn der uC weiß ja nicht >wie ich 
meine
>                            // Anzeige angeschlossen habe.

übergiebst. Also 'M'. Den wert bekommst du aus einer ASCII Tabelle.

von Svenska (Gast)


Lesenswert?

Hallo,

> und zwar möchte ich gerne AVR programmieren lernen und hab mir aus
> diesem Grund ein Buch gekauft.

Du möchtest den AVR sogar in C programmieren lernen. Dazu brauchst du 
auch noch C-Kenntnisse. :-)

> const char text[] = "++ HELLO WORLD! WIE GEHT'S? **";
> //wie wird das abgespeichert? jedes Zeichen extra? also text[4]='E'?

Ja. Die Zeichenkette "abc" wird abgespeichert als {'a','b','c','\0'}. 
Das Nullbyte markiert das Ende.

> void char_out (uint8_t zeichen)
> //wieso steht das so, und nicht im Hauptprogramm?

Weil das eine Funktion ist.

>     char_out ('M'); // was macht dieser Befehl?
> // denn der uC weiß ja nicht wie ich meine Anzeige angeschlossen habe.

Er ruft die Funktion char_out() auf, die oben deklariert ist.
Der uC muss nicht wissen, wie die Anzeige angeschlossen ist - aber die 
Funktion muss es wissen. Wenn du deine Anzeige änderst, musst du nicht 
die Welt umprogrammieren, sondern nur die Ausgabefunktion.

> Ich komme mir gerade extrem dumm vor, da ich kaum etwas verstehe, aber
> im Buch waren vorher nur ganz grundlegende Dinge wie Bit setzen, löschen
> und invertieren erklärt und auf einmal so ein Beispiel.

Das sind alles Dinge, die beim Umstieg vom PC auf Mikrocontroller neu 
oder zumindest ungewohnt sind. Bevor du versuchst, einen Mikrocontroller 
zu programmieren, solltest du versuchen, einen PC zu programmieren.

Mein Tipp: Besorge dir ein C-Buch aus der Bibliothek deines Vertrauens 
und arbeite das durch. Danach kehrst du zum AVR zurück. Das macht es 
vermutlich einfacher.

Gruß,
Svenska

von Nandfänger (Gast)


Lesenswert?

M. K. schrieb:
> Ich komme mir gerade extrem dumm vor, da ich kaum etwas verstehe,

Lass Dich nicht entmutigen, Jeder muß 'mal klein anfangen.
1
const char text[] = "++ HELLO WORLD! WIE GEHT'S? **"; //wie wird das
2
abgespeichert? jedes Zeichen extra? also text[4]='E'?

Genau, das char text[] ist ein Array, man kann auch Feld dazu sagen. 
Hier ist es ein Feld von Zeichen, ein "Array of char".
1
void char_out (uint8_t zeichen) //wieso steht das so, und nicht im
2
 Hauptprogramm?
3
 {
4
     PORTB=sign[zeichen-32]:  //welchen Wert hat ''zeichen"?
5
     PORTC=(sign[zeichen-32]>>8);
6
 }

Das ist eine Funktion. Die steht da, damit man nicht im Mainprogramm 
jedesmal den Selben Code wieder schreiben muß. Zeichen hat den Wert, den 
Du beim Aufruf der Funktion übergibst. Wenn Du im Hauptprogramm 
jetzt char_out('Z') machst, dann ist das Zeichen eben ein Z (bzw. dessen 
ASCII-Wert).
1
       PORTC = (sign[i] >> 8); //was mach das? was bringt es mir?

Das ist eine Schiebeoperation, auch Shift genannt. >> schiebt nach 
Rechts, << schiebt nach links. Die 8 ist die Anzahl der Stellen, um die 
verschoben wird. Angenommen Du hast ein byte a mit Wert 00110000 und du 
machst jetzt einen Rechtsschift um 3 stellen, also a >> 3, dann ist a 
später 00000110.

Ich programmiere keine AVRs, was genau das hier macht, kann ich nicht 
sagen. Wird sich aber bestimmt jemand finden, der das weiß ;)
1
    char_out ('M');  // was macht dieser Befehl? denn der uC weiß ja
2
 nicht wie ich meine    // Anzeige angeschlossen habe.

Hier wird die Funktion von oben aufgerufen. Die Anzeige muß natuerlich 
so angeschlossen sein, wie es im Buch vorgegeben ist, sonst funktioniert 
das natuerlich nicht.

> im Buch waren vorher nur ganz grundlegende Dinge wie Bit setzen, löschen
> und invertieren erklärt und auf einmal so ein Beispiel.

Vielleicht ist das Buch schlecht geschrieben, vielleicht liest Du an der 
falschen Stelle oder das Buch setzt Kenntnisse in C eben voraus.

Anyway, das wird schon. Gruß, N.

von M. K. (theother)


Lesenswert?

Vielen Danke für die ganzen hilfreichen und schnellen Antworten!

'Computer C' lernen wir gerade in der Schule haben auch gerade mit 
Arrays/Strings angefangen, nur für uC's ist das doch ganz schön anders. 
Aber ich werde es schon schaffen :-)


... ahhh okay das wird dann um 8 Bits nach rechts geshiftet, da immer 
die niederwertigsten 8 Bit genommen werden und wir das sonst nicht auf 2 
Ports ausgeben können.

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.