Forum: Mikrocontroller und Digitale Elektronik Netzwerk tester


von thunderbird (Gast)


Lesenswert?

moin schönen guten tag,

i bäuchte hilfe bei nem program für nen netzwerktester.

also die hardwäre habe i so weit vorgeschrieben bekommen :'(.

Gegeben ist das MyAVR MK2 USB mit dem MyAVR LCD Add-On sowie:
9x LED 5MM 12V RT   Rote 5mm-LED mit Vorwiderstand
9x 1/4W 220         Kohleschichtwiderstand 1/4W, 5%, 220
1x 74HC 137         3/8 LINE DEC/SPEI+INV.
2x 74AC 00          IC-SCHALTUNG

dies soll in einer switch case funktion laufen. wobei von dem programm 
ein grober rohling bereitz existirt.

man soll den tester starten können über taster ein und mit dem 2. taster 
noch die möglich keit haben einen fehler zu wählen. wobei es erst ma 
wichtig wäre nur zu testen über den ersten taster und halt auf dem 
display steht start.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
// Konstantendefinition
5
#define test1    1
6
#define test2     2
7
#define test3    3
8
#define test4    4
9
#define test5    5
10
#define test6    6
11
#define DELAY     7
12
13
// Globale Variablen
14
volatile unsigned int count;
15
int status = test1, delay, next_status, merker = 0;
16
17
18
// Timer Counter Overflow
19
ISR(TIMER0_OVF_vect)
20
{
21
 TCNT0 = 112;     // TZyklus 10ms
22
 ++count;         // Zählerwert inkrementieren
23
}
24
25
// Netzwerktester "state machine"
26
void io_states(void)
27
{
28
  switch(status)
29
  {
30
    case 1 :    PORTB     = 0x12;
31
                delay     = 250;   
32
            next_status   = test2;
33
            status     = DELAY; 
34
                      break;
35
36
    case 2 :   PORTB = 0x1A;
37
                    delay = 50;
38
              next_status = test3;
39
              status = DELAY;
40
41
                break;
42
43
    case 3 :  PORTB = 0x06;
44
                    delay = 1000;
45
            next_status = test4;
46
            status = DELAY;
47
48
                      break;
49
50
    case 4 :  PORTB = 0x06;
51
                    if(!(PIND & 0x04) || !(PIND & 0x08) || merker == 1)
52
            {
53
                delay = 100;
54
                next_status = test5;
55
              merker = 0;
56
                status = DELAY;
57
            }
58
59
                      break;
60
61
    case 5 :    PORTB = 0x0A;
62
                    delay = 50;
63
            next_status = test6;
64
            status = DELAY;
65
66
                      break;
67
68
    case 6 :    PORTB = 0x11;
69
                    delay = 500;
70
            next_status = test1;
71
            status = DELAY;
72
73
                      break;
74
75
    case DELAY :      --delay;
76
                    if(next_status == test1 && 
77
               (!(PIND & 0x04) || !(PIND & 0x08))) 
78
                          merker = 1;
79
                    if(delay == 0)
80
                  status = next_status;
81
82
                      break;
83
84
    default: 
85
  
86
           break;
87
  }
88
}
89
90
int main(void)
91
{
92
 DDRB   = 0xff;  // PortB LED Port
93
 DDRD   = 0x00;  // PortD Tasten Port
94
 PORTD  = 0x0C;  // Interne Pull-Up PB.0/PB.1/PB.2 aktivieren (für myAVR)
95
 TIMSK |= 0x01;  // Interruptfreigabe Timer0_overflow
96
 TCCR0  = 0x04;  // Prescaler 256
97
 TCNT0  = 112;  // Startwert TCNT0
98
 SREG  |= 0x80;  // Globale Interruptfreigabe
99
 PORTB  = 0x00;  // Alle LEDs aus
100
101
 while(1)
102
 {
103
   if(count >= 2)  // Zykluszeit 20ms
104
   {
105
     count = 0;
106
   io_states();
107
   }  
108
 }
109
}

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

es ist immer wieder erstaunlich, daß Leute welche programmieren können, 
die Syntax (Groß/Kleinschreibung, Grammatik) ihrer Programmiersprache 
beherrschen (notgedrungen eher "müsssen"), aber im "richtigen Leben" mit 
"menschlicher" Sprache an genau diesen Dingen (Groß/Kleinschreibung, 
Grammatik) scheitern ...

von thunderbird (Gast)


Lesenswert?

ja ist es.

nur zu faul fürn cap immer

von STK500-Besitzer (Gast)


Lesenswert?

>    case 1 :    PORTB     = 0x12;
>                delay     = 250;
>            next_status   = test2;
>            status     = DELAY;
>                      break;

Und welchen Wert hat "Delay"?
Den States sollte man auch sinnvolle Namen geben, wenn man sie an 
anderen Stellen auch so schreibt.

>Gegeben ist das MyAVR MK2 USB mit dem MyAVR LCD Add-On sowie:
>9x LED 5MM 12V RT   Rote 5mm-LED mit Vorwiderstand
>9x 1/4W 220         Kohleschichtwiderstand 1/4W, 5%, 220
>1x 74HC 137         3/8 LINE DEC/SPEI+INV.
>2x 74AC 00          IC-SCHALTUNG

Und den Schaltplan muss man raten?

>es ist immer wieder erstaunlich, daß Leute welche programmieren können,
>die Syntax (Groß/Kleinschreibung, Grammatik) ihrer Programmiersprache
>beherrschen (notgedrungen eher "müsssen"),
Das "können" solltest du weglassen...

>aber im "richtigen Leben" mit "menschlicher" Sprache an genau diesen >Dingen 
(Groß/Kleinschreibung, Grammatik) scheitern ...
ACK!

von STK500-Besitzer (Gast)


Lesenswert?

>nur zu faul fürn cap immer

Und den Quellcode auch noch irgendwo geklaut...

von yv<xyb (Gast)


Lesenswert?

zu faul zum Raten....

von thunderbird (Gast)


Lesenswert?

der code is net geklaut

von thunderbird (Gast)


Angehängte Dateien:

Lesenswert?

so vieleicht hilft das schon weiter.

von Bastler (Gast)


Lesenswert?

>>der code is net geklaut

Interessant wie viele Fehler man in einem kurzen Satz machen kann!

Der Code ist nicht geklaut.

...ich komm auf fünf.

von thunderbird (Gast)


Lesenswert?

mist was man nicht im kopf hatt.

die beiden ic kommen auf 1a+1b zusammenlegen so dass
dann y1 dem negierte signal sprich 0 zu 1 und 1 zu 0

von Bastler (Gast)


Lesenswert?

>>mist was man nicht im kopf hatt.

Aua!

Du Legosteiniger.

von thunderbird (Gast)


Lesenswert?

ja sorry hatte die nacht schwiße gepennt und habe magen darm hinter mir 
doch das ist egal.

geht ja um die sach lage

von yv<xyb (Gast)


Lesenswert?

>die sach lage

Die Schlage ist folgende: Du kannst nicht lesen oder Gelesenes nicht 
verstehen und Dich auch auf Aufforderung nicht danach richten. Wieso 
sollte Dir jemand Deine Arbeit machen, wo Du dessen Rat doch nicht 
befolgen wuerdest?

Gast

von thunderbird (Gast)


Lesenswert?

i bitte nicht drum das man mir meine arbeit macht bitte nur um hilfe für 
den ansatz.

und lesen kann i und wenn i mir net helfen lassen wollte oder rat bitte 
würde i so was doch net in nen forum posten

von Christian (Gast)


Lesenswert?

Anzumerken wäre auch noch, dass die Scans (zumindest für mich) nicht zu 
entziffern sind..

von yv<xyb (Gast)


Lesenswert?

Wenn Du nicht vernuenftiges Deutsch nach den Forenregeln schreibst, 
kannst Du Hilfe wohl weitgehend vergessen. Es hat einfach kaum einer 
Lust, sich das anzutun. (Zumindest die Leute mit Sachkenntnis.)

Gast

Hier noch einmal, falls Du es jeweils beim Schreiben uebersehen hast:

Wichtige Regeln - erst lesen, dann posten!

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

von Karl H. (kbuchegg)


Lesenswert?

Bring erst mal dein vorhandenes Programm auf Vordermann.
So was
1
PORTB     = 0x12
ist der Tod jeglicher vernünftiger Entwicklungsarbeit. Warum 0x12? Warum 
nicht 0x13 oder 0x11?
Solche Bitkonstante sind immer Mist.
Drösele das in Bits auf, geben jedem Bit einen Namen entsprechend seiner 
Funktion und benutze die Schreibweise (am Beispiel von Leds)

   LED_PORT = ( 1<<ERROR_LED ) | ( 1<<SEVERE_FAILURE);

um zb die Fehler LED und die Fatal Fehler LEd am Led Port einzuschalten. 
Dann kann man auch aus dem Code erkennen, was eigentlich passieren soll.

Das wäre aus meiner Sicht mal das Wichtigste: Den vorhandenen Code in 
eine vernünftige Form zu giessen, damit man auch damit arbeiten kann. 
Das was du jetzt hast ist zwar eine Statemachine, aber aus dem Code geht 
absolut nicht hervor, was da eigentlich passiert und warum, was die 
einzelnen States sein sollen (test ist so ein nichtssagender Name für 
<egal was>)

von thunderbird (Gast)


Angehängte Dateien:

Lesenswert?

So habe es noch mal geändert und als PDF hochgeladen.

von Karl H. (kbuchegg)


Lesenswert?

thunderbird schrieb:
> So habe es noch mal geändert und als PDF hochgeladen.

Warum als PDF?
Du kannst dein C-File ganz einfach so wie es ist anhängen.

Und eine wirkliche Verbesserung im Stil kann ich immer noch nicht 
erkennen, geschweige denn, das irgendein Detail klarer geworden wäre. 
OK, die cases haben jetzt Namen anstelle von Zahlen, aber was 
beispielsweise bei test5 passiert, ist immer noch im Dunkeln. Liegt 
vielleicht auch daran, dass einem die Bezeichnung 'test5' so gut wie 
nichts sagt.

Ob du an einen Port 0x37 oder 0b00110111 zuweist, liefert denselben 
Informationsgehalt. Von der scheuslichen Formatierung reden wir erst mal 
nicht (das musst du doch auch selber gesehen haben, dass deine Zeilen 
alle wie Kraut und Rüben verschieden eingerückt sind)

> man soll den tester starten können über taster ein

Welcher Taster?
Wo hängt der?
Was bedeutet: den Tester starten?

> und mit dem 2. taster noch die möglich keit haben einen
> fehler zu wählen.

Was bedeutet 'einen Fehler wählen'?

von thunderbird (Gast)


Lesenswert?

So der Taster liegt an PINB an und tester starten heißt nichts anderes 
als das man (Wie bei einem normalen Netzwertester zb für 20EUR)den test 
einschalten kann um zu schauen ob alle 8 Leitungen korekt anliegen.

Das mit dem fehler ein bauen ist zunächt einmal egal. erst ma die grund 
idea von dem Teil gangbar bekommen.

von Karl H. (kbuchegg)


Lesenswert?

Ich mag nicht mehr dir die Würmer aus der Nase ziehen.
Viel Spass bei deinem Projekt.

von thunderbird (Gast)


Lesenswert?

Mh.

Ich hatte dir nur grade eben deine Frage beantwortet und den rest 
versuche ich dir so zu machen das man es versteht

von Flo (Gast)


Lesenswert?

Schaltplan?

von thunderbird (Gast)


Lesenswert?

würd i gerne geben bekomme den nicht so hin wie ich will.

Ja klingd scheiße ich weiß.

von Sven H. (dsb_sven)


Lesenswert?

Lad dir doch mal die kostenlose Version von CadSofts Eagle 
(http://www.cadsoft.de/freeware.htm) runter. Damit kannst du (mit 
erstaunlich kurzer Einarbeitungszeit) einen schicken Schaltplan 
zeichnen. Das hat auch noch den Vorteil, dass du dein Radiergummi 
schonst. Und wenn du den dann als *.png hier hoch lädst können den auch 
alle wunderbar lesen und verstehen.

Der zweite Punkt: Wenn du die c-Datei etwas schicker formatierst und 
hier direkt hoch lädst können wir deinen Quellcode besser auseinander 
nehmen.

Das könntest du dann noch toppen, wenn du dir etwas mühe gibst beim 
schreiben deiner Beiträge, wenn denn ich einen Satz erst zwei bis drei 
mal lesen muss, bis ich verstanden habe, was du damit meinst, macht es 
mir (ich denke, ich bin da nicht der Einzige) keinen Spaß sich da durch 
zu kämpfen.


Lange Rede, kurzer Sinn, vielleicht machst du mal einen ordentlichen 
Stromlaufplan und postest den dann hier und wir schauen dann, wie wir 
dir helfen können?

von Karl H. (kbuchegg)


Lesenswert?

thunderbird schrieb:
> würd i gerne geben bekomme den nicht so hin wie ich will.
>
> Ja klingd scheiße ich weiß.

Tut es wirklich.

Für den Anfang würde es schon ausreichen, wenn daraus ersichtlich ist:
An welchem Pin vom µC hängt was?

Ob da jetzt der letzte Abblockkondensator mit eingezeichnet ist, oder 
der 7805, der alles versorgt, oder der Quarz ist erst mal nicht so 
wichtig.
Aber eine Aussage: Der Taster liegt am PINB
ist ungefähr so aussagekräftig wie: Das Hofbräuhaus ist in München.
Deswegen finde ich immer noch nicht hin.

Und das eigentlich Traurige ist, dass man dir das alles sagen muss. 
Nicht einmal, nicht zweimal, sondern immer wieder.

von einer der es nicht versteht (Gast)


Lesenswert?

thunderbird schrieb:
> So der Taster liegt an PINB an und tester starten heißt nichts anderes
> als das man (Wie bei einem normalen Netzwertester zb für 20EUR)den test
> einschalten kann um zu schauen ob alle 8 Leitungen korekt anliegen.



Aua Grundlagen bitte erarbeiten, es gibt keinen PinB sondern nur einen 
PortB der seinerseits aus mehreren Pins besteht. Da du aber noch nicht 
mal rausgerückt hast welcher Kontroller zum Einsatz kommt gehts hier 
halt nicht weiter.....

Das MK2 ist lediglich ein Programmieradapter.

Gruß
einer der es nicht versteht

von Karl H. (kbuchegg)


Lesenswert?

thunderbird schrieb:
> der code is net geklaut

Der Code ist aber auch nicht von dir.
Selbst in der Urfassung passt der Code nicht zu dem Wissen (eigentlich 
Nicht-Wissen), dass du in weiterer Folge gezeigt hast.


Dazu passt dann auch

> So der Taster liegt an PINB an

und
1
int main(void)
2
{
3
 ...
4
 DDRD   = 0x00;  // PortD Tasten Port

von Karl H. (kbuchegg)


Lesenswert?

Warum wir so pingelig sind?

Du willst in ein bestehendes Programm eine Erweiterung einbauen. Dazu 
muss man aber das vorhandene Programm wenigstens in Grundzügen 
verstehen. Man fängt da erst mal mit einem Haufen Vermutungen an, die 
sich dann immer mehr konkretisieren. Nun ist das aber eigentlich nicht 
unsere Aufgabe, diese ganzen Vermutungen auszuräumen.

Für dein Problem mit dem Start Taster gibt es 2 Möglichkeiten:

* die etwas universellere:
  Die Tastenabfrage wird mit in die Statemaschine eingebaut. Das kann
  Vorteile bringen, wenn noch mehr Tasten zu berücksichtigen sind.
  Ausserdem hat man dann eine gute Möglichkeit, die Statemachine aus
  jedem beliebigen Zustand in eine saubere Konfiguration zu fahren.

* die banale Lösung:
  Die Tastenabfrage kommt in die Hauptschleife. Da deine Statemaschine
  nur dann läuft, wenn die Funktion io_states() auch aufgerufen wird,
  steuert der Taster einfach nur, ob diese Funktion aufgerufen wird
  oder nicht.
  Man macht sich eine Variable, die diesen Zustand anzeigt. Am Anfang
  ist die auf FALSE und wenn die Taste gedrückt wird, geht die Variable
  auf TRUE. Ist die Variable auf TRUE, so wird die Funktion auch
  aufgerufen. Gleichzeitig mir dem drücken des Start Tasters wird auch
  der State der Statemaschine auf den Startzustand gestellt, damit die
  auch von vorne anfängt.
  Das ist die Brachiallösung. Nicht sauber, nicht elegant.
  Insbesondere würgt diese Lösung einen gerade laufenden Test einfach
  mitten drinn ab, ohne sich darum zu kümmern, dass die Statemachine
  erst mal in einen gültigen Zustand gefahren werden möchte.

1
unsigned char  testRunning;
2
3
#define START_TASTER   PD0
4
5
....
6
7
int main()
8
{
9
   ....
10
11
  testRunning = 0;
12
13
  while( 1 ) {
14
15
   if( !( PIND & ( 1 << START_TASTER ) ) ) {
16
     status = test1;    // mit diesem Zustand geht die Statemachine ins Rennen
17
     testRunning = 1;   // und sie wird eingeschaltet
18
   }
19
20
   if(count >= 2)  // Zykluszeit 20ms
21
   {
22
     count = 0;
23
     if( testRunning == 1 )
24
       io_states();
25
   }  
26
}

Das alles ignoriert natürlich jegliches Tastenprellen, aber jemand der 
eine Statemachine programmieren kann und die ersten Kapitel im 
AVR-GCC-Tutorial durch hat, sollte das vor keinerlei Überraschungen 
stellen.

von thunderbird (Gast)


Angehängte Dateien:

Lesenswert?

Thx das Programm macht so weit erst ma was es soll

von Karl H. (kbuchegg)


Lesenswert?

Na ja.

Aber eines noch. Das tut einfach zu weh.

Das hier
1
 lcd_init( LCD_DISP_ON );
2
 char will[] = "Willkommen beim";
3
 char netz[] = "Netzwerktester";
4
 char start[] = "START";
5
 
6
7
 sprintf(buffer,"%s",will);   // Ausgabe: Willkommen beim
8
 lcd_gotoxy(0,0);
9
 lcd_puts(buffer);
10
 
11
 sprintf(buffer,"%s",netz);   // Ausgabe: Netzwerktester
12
 lcd_gotoxy(0,1);
13
 lcd_puts(buffer);

schreibs einfacher
1
 lcd_init( LCD_DISP_ON );
2
3
 lcd_gotoxy(0,0);
4
 lcd_puts( "Willkommen beim" );
5
6
 lcd_gotoxy(0,1);
7
 lcd_puts( "Netzwerktester" );

Du musst nicht die Texte vorher umständlich in Variablen erzeugen, um 
sie mittels sprintf in wieder andere Arrays möglichst kompliziert 
umzukopieren und das Ergebnis dann irgendwann endlich an lcd_puts zu 
übergeben.

Persönlich betrachte ich eigentlich Geräte, die einem nach dem 
Einschalten mit "Willkommen zu XYZ, Copyright sowieso" begrüssen als 
Armutszeugnis des Programmierers. Die Phrase "Willkommen zu" ist 
meistens ein deutliches Indiz für einen Einsteigerprogrammierer. Man 
kann auch sagen: Das ist meistens so ziemlich das Einzige was sie 
fehlerfrei hinkriegen, darum muss es in jedes Programm rein. Und wie man 
bei dir sieht, kriegst du noch nicht einmal das vernünftig hin.


Edit:
Das deine 20ms Zykluszeit durch die LCD Ausgabe mitlerweile Makulatur 
sind, ist dir anscheinend nicht bewusst bzw. es stört dich nicht 
besonders.

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.