mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Netzwerk tester


Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include <avr/io.h>
#include <avr/interrupt.h>

// Konstantendefinition
#define test1    1
#define test2     2
#define test3    3
#define test4    4
#define test5    5
#define test6    6
#define DELAY     7

// Globale Variablen
volatile unsigned int count;
int status = test1, delay, next_status, merker = 0;


// Timer Counter Overflow
ISR(TIMER0_OVF_vect)
{
 TCNT0 = 112;     // TZyklus 10ms
 ++count;         // Zählerwert inkrementieren
}

// Netzwerktester "state machine"
void io_states(void)
{
  switch(status)
  {
    case 1 :    PORTB     = 0x12;
                delay     = 250;   
            next_status   = test2;
            status     = DELAY; 
                      break;

    case 2 :   PORTB = 0x1A;
                    delay = 50;
              next_status = test3;
              status = DELAY;

                break;

    case 3 :  PORTB = 0x06;
                    delay = 1000;
            next_status = test4;
            status = DELAY;

                      break;

    case 4 :  PORTB = 0x06;
                    if(!(PIND & 0x04) || !(PIND & 0x08) || merker == 1)
            {
                delay = 100;
                next_status = test5;
              merker = 0;
                status = DELAY;
            }

                      break;

    case 5 :    PORTB = 0x0A;
                    delay = 50;
            next_status = test6;
            status = DELAY;

                      break;

    case 6 :    PORTB = 0x11;
                    delay = 500;
            next_status = test1;
            status = DELAY;

                      break;

    case DELAY :      --delay;
                    if(next_status == test1 && 
               (!(PIND & 0x04) || !(PIND & 0x08))) 
                          merker = 1;
                    if(delay == 0)
                  status = next_status;

                      break;

    default: 
  
           break;
  }
}

int main(void)
{
 DDRB   = 0xff;  // PortB LED Port
 DDRD   = 0x00;  // PortD Tasten Port
 PORTD  = 0x0C;  // Interne Pull-Up PB.0/PB.1/PB.2 aktivieren (für myAVR)
 TIMSK |= 0x01;  // Interruptfreigabe Timer0_overflow
 TCCR0  = 0x04;  // Prescaler 256
 TCNT0  = 112;  // Startwert TCNT0
 SREG  |= 0x80;  // Globale Interruptfreigabe
 PORTB  = 0x00;  // Alle LEDs aus

 while(1)
 {
   if(count >= 2)  // Zykluszeit 20ms
   {
     count = 0;
   io_states();
   }  
 }
}


Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ist es.

nur zu faul fürn cap immer

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>nur zu faul fürn cap immer

Und den Quellcode auch noch irgendwo geklaut...

Autor: yv<xyb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu faul zum Raten....

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der code is net geklaut

Autor: thunderbird (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so vieleicht hilft das schon weiter.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>mist was man nicht im kopf hatt.

Aua!

Du Legosteiniger.

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yv<xyb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

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

Autor: yv<xyb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bring erst mal dein vorhandenes Programm auf Vordermann.
So was
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>)

Autor: thunderbird (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So habe es noch mal geändert und als PDF hochgeladen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'?

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: thunderbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mh.

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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltplan?

Autor: thunderbird (Gast)
Datum:

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

Ja klingd scheiße ich weiß.

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: einer der es nicht versteht (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
int main(void)
{
 ...
 DDRD   = 0x00;  // PortD Tasten Port

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


unsigned char  testRunning;

#define START_TASTER   PD0

....

int main()
{
   ....

  testRunning = 0;

  while( 1 ) {

   if( !( PIND & ( 1 << START_TASTER ) ) ) {
     status = test1;    // mit diesem Zustand geht die Statemachine ins Rennen
     testRunning = 1;   // und sie wird eingeschaltet
   }

   if(count >= 2)  // Zykluszeit 20ms
   {
     count = 0;
     if( testRunning == 1 )
       io_states();
   }  
}

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.

Autor: thunderbird (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Thx das Programm macht so weit erst ma was es soll

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja.

Aber eines noch. Das tut einfach zu weh.

Das hier
 lcd_init( LCD_DISP_ON );
 char will[] = "Willkommen beim";
 char netz[] = "Netzwerktester";
 char start[] = "START";
 

 sprintf(buffer,"%s",will);   // Ausgabe: Willkommen beim
 lcd_gotoxy(0,0);
 lcd_puts(buffer);
 
 sprintf(buffer,"%s",netz);   // Ausgabe: Netzwerktester
 lcd_gotoxy(0,1);
 lcd_puts(buffer);

schreibs einfacher
 lcd_init( LCD_DISP_ON );

 lcd_gotoxy(0,0);
 lcd_puts( "Willkommen beim" );

 lcd_gotoxy(0,1);
 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.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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