Homepage

  • Projekte
  • Shop
  • Forum
Erweiterte Suche
  • Schnellzugriff
    • Unbeantwortete Themen
    • Aktive Themen
    • Suche
  • FAQ
  • Anmelden
  • Registrieren
  • Foren-Übersicht
  • Suche

Impulszähler Solaranlage

Ethernet Mega32 Experimentierboard
Antworten
  • Druckansicht
Erweiterte Suche
28 Beiträge
  • Vorherige
  • 1
  • 2
norbert_w
Beiträge: 1
Registriert: 02.05.2010, 13:06:06

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von norbert_w » 02.05.2010, 13:18:14

@birgert und dreamon,
habe seinerzeit mal einen Beitrag im 'Konkurrenzforum' gepostet, ich denke, der wird euch weiterhelfen.
Hier der Link: http://son.ffdf-clan.de/include.php?pat ... readid=372

Birgert hat Recht, die 1024 ist der Teilerwert (Quotient), ich habe den nochmals mit 40 dividiert und rufe die ISR ca. alle 25ms auf (ohne Probleme, wenn die 'Altvariablen' entsprechend angepasst werden).

Mit freundlichen Grüßen,
norbert_w
Nach oben

Benutzeravatar
Birgert
Beiträge: 33
Registriert: 15.04.2010, 20:47:13
Wohnort: Kreuzung BAB3 und B470

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von Birgert » 02.05.2010, 21:55:46

Hi draemon; biste mit der Mouse abgerutscht :)
dreamon hat geschrieben:Also ich hab jetzt nochmal einen Timer, blauäugig gesetzt. Und der tut sogar. 924mal in 2Sekunden. (hab nen Counter mitlaufen lassen also nur ne Schätzung.)

Aber wenn man grob 500 Timer Interrupts Pro sekunde rechnet kommt man mit 20ms ganz gut hin. Erfasse nun alle 3 Takte auf auf einmal. Mit ByteNeu&~ByteAlt geht das ganz gut.

Ich werd mal die Praxistauglichkeit testen. Aber immerhin läuft es. Hab nen avr-gcc fehler entdeckt. Der hat mich heute bestimmt 3Stunden gekostet. Hab immer gedacht ich hab nen Programmierfehler gemacht. Der weil hat gcc mir nen Streich gespielt.

Naja.. Was soll.

Mal schauen wies weitergeht. Mich würde noch interessieren was man machen muß das der Browser der den Webserver anzeigt regelmäßig refresht so alle 50Sekunden wäre was.
Also erstmal - Glückwunsch, dass D'es hingebracht hast - Du meintest bestimmt 50 Timerinterrupts / Sekunde.

Aber erzähl mal was vom entdeckten Fehler des avr-gcc...Lass mal ein bisschen Code sehen :D

Wegen dem Autorefresh, soviel ich bisher weiss geht das entweder vom Server aus, oder über ein Plugin im Browser (für Firefox dürfte da was zu finden sein). Ich muß bei einem Kunden noch Web-Bedienplätze mit Webserver (MS Server & IIS) in Betrieb setzen, und stehe da vor einem ähnlichen Problem - Aktualisierung (Rate im Webserver einstellbar) und kein automatisches LogOff...?? :roll:
Nach oben

Klaus
Beiträge: 409
Registriert: 17.02.2008, 12:18:39

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von Klaus » 02.05.2010, 23:50:21

norbert_w hat geschrieben:Wegen dem Autorefresh, soviel ich bisher weiss geht das entweder vom Server aus, oder über ein Plugin im Browser (für Firefox dürfte da was zu finden sein). Ich muß bei einem Kunden noch Web-Bedienplätze mit Webserver (MS Server & IIS) in Betrieb setzen, und stehe da vor einem ähnlichen Problem - Aktualisierung (Rate im Webserver einstellbar) und kein automatisches LogOff...??
Lösung:

//Dazustellende Webseite
PROGMEM char Page1[] = {
"<html>"
"<meta http-equiv= Refresh content = 30>" <<<== in Sekunden
"<META HTTP-EQUIV= pragma CONTENT= no-cache >"
"</html>"
"<head>"


mfg

Klaus
Nach oben

dreamon
Beiträge: 48
Registriert: 01.02.2006, 00:42:32

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von dreamon » 03.05.2010, 14:46:47

Danke für eure Tipps.

Hab heute den Webserver an die Solaranlage angeschlossen. Läuft!!

Soweit ich das feststellen kann zählt er zuverlässig. Diese kWh Zählermodule mit dem S0-Bus spielen ganz gut mit dem Webserver zusammen.

Was mir gut gefällt.
Man sieht schon nach einer 1/2Stunde die Leistungsunterschiede der 3Speisepunkte.

Klaus danke für den Code, das werde ich heute Abend mal einpflegen.

Den Code werde ich heute Abend noch etwas. (Bin keine sauberer Programmierer. Also bitte um Gnade!)

Den Timer hab ich nicht mehr angefaßt. (Hab mir aber auch nicht viel mühe gegeben, da er auf Anhieb den gewünschten Takt hatte ;-) )

Was noch fehlt:
Ich will die Daten nun noch monatlich erfassen. Januar, Februar.. usw. Nun meine Frage, kann ich die Daten irgendwo im Atmega644 im Eeprom ablegen, so das es vor einer Löschung wegen Stromausfall gefeit ist?

Vielleicht habt ihr mir einen Codeschnipsel.
Zum einen wie ich die Daten da hin bekomme, zum anderen bei einem Neustart wieder auslesen kann.

Da fällt mir ein, ob das Datum auch richtig gesetzt wird um 24Uhr, oder holt er das regelmäßig aus dem Netz. Beim Start ist ja klar. Hab den Code gerade nicht zur Verfügung.

Gruß
Nach oben

fergie
Beiträge: 1
Registriert: 03.05.2010, 18:00:02

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von fergie » 03.05.2010, 18:09:12

Ich messe den S0 Bus bei meinem MEGA644 /16MHz über das PIN Change Register, da kann man dann auch mehrere Zähler anschließen....

Code: Alles auswählen

	
	PCICR  |= (1<<PCIE2);
	PCMSK2 |= (1<<PCINT21); //Port C5 ist Interrupteingang für Drehstrom-zähler (S0)
	
// Timer2 misst Millisekunden
	TCCR2B = 0 | (1<<CS11 | 1<<CS12); //prescaler 256
	TIMSK2 |= (1 << TOIE2);

ISR (TIMER2_OVF_vect) // Erzeugt Millisekunden
{ 	// Bei 16 MHz Prescaler 255 4,08 ms pro 255-Durchlauf oder Periode

  TCNT2 = 255-62; //eigentlich 62,5
  strommsek++; 

}

/******************************
// 1kWh = 3600 kWs = 3600000 Ws
// Je kWh gibt mein Zähler 1000 Ticks ab
// Zur Veranschaulichung:
// Wenn alle 1000 ms (jede Sekunde) ein Tick kommt, beträgt die aktuelle Leistung Pab 3600000Ws : 1s : 1000  = 3600 Watt
// Würde die Zeit zwischen 2 Ticks 2 Sekunden betragen, wäre die Leistung 3.600.000Ws : 2s : 1000 = 1800 Watt

SIGNAL(SIG_PIN_CHANGE2) // Drehstrom-Zähler S0 Ausgang
{
  if (strommsek > 200) // Kürzere Impulszeiten werden herausgefiltert, PinChange reagiert bei steigender und fallender Flanke
						// Käme alle 200 ms ein Impuls, wäre die aktuelle Leistung 5 x 3600 W = 18000 W
    {
	 Pab = 3600000 / strommsek; // Der Zähler liefert 1000 Ticks / kWh 
     Etticks++;
     strommsek = 0; 
   } 
}
******************** PIN CHANGE
Grüße fergie
Nach oben

dreamon
Beiträge: 48
Registriert: 01.02.2006, 00:42:32

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von dreamon » 03.05.2010, 21:10:45

Birgert also das ist für dich:

Code: Alles auswählen

TCCR2B |= (1<<WGM22) | (1<<CS20 | 0<<CS21 | 1<<CS22);
TCNT2 = 0;
TIMSK2 |= (1 << OCIE2A);
// Vielleicht kann mir einer sagen was ich da genau gesetzt hab. Welchen Takt? ;-)
Eventuell kann mir auch einer sagen, wie man ihn errechnen kann. Das Datenblatt ist 
mir zu hoch. Die Beispiele von euch waren sehenswert aber ließen immer noch Fragen offen.
----------------------------------------------------------------------------------------


//Timer Interrupt

ISR (TIMER2_COMPA_vect)
{
Testbit++;                                                    // zählt die Einsprünge .. Unwichtig.
Merke = Impuls_Port_Read;                                     // PortA Auslesen (Bit 1,2,3)
if (Merke!=Muster)                                           // Abkürzen wenn sich nichts getan hat.
	{
	patt  = Merke&~Muster;                                     // patt !=0 -> Ein oder mehrere Pins springen auf High.
	if (patt) { 		if (patt & 1) {StromZaehler1++;}
				if (patt & 2) {Strom2++;}		                  // Wegen Compilerfehler umbenannt!
				if (patt & 4) {StromZaehler3++;}	
		    } 
	Muster=Merke;                                            // neues Muster merken!
	}
}

In der Main steht:
 
Lcd_print(1,0,"T:%4i|%4i|%4i", StromZaehler1, Strom2, StromZaehler3);	

Wenn ich hier den int Strom2 in Stromzaehler2 umbenenne, (natürlich auch oben im Timer Interrupt) dann fehlt mir die Ausgabe der Variable. Hab schon mehrfach Probiert. Da macht avr-gcc einen Fehler. Nur das Umbennen führt zu einer korrekten Ausgabe. Ganz schlimm wird es wenn ich aus "int" long int mache, dann kann ich umbenennen wie ich will. Die 2
Variable wird nicht ausgeben. 0000 tzzz. Obwohl der Inhalt korrekt ist. Wenn ich z.B. nur Strom2 ausgebe geht es.

Bei mir läufts fein. Ich habe die Eingänge mit 1k nach GND gezogen.

Läuft super.
Nach oben

Benutzeravatar
Birgert
Beiträge: 33
Registriert: 15.04.2010, 20:47:13
Wohnort: Kreuzung BAB3 und B470

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von Birgert » 04.05.2010, 13:41:40

Servus draemon;
Danke für Deine Teilhabe; aber sag'mal, hast Du Deine Zähler jetzt als uint16_t deklariert? Dann wäre nach 65535 Impulsen ein Überlauf und die Zähler beginnen wieder bei Null (etwa morgen mittag oder so).
Und wie haste die Zähler deklariert, Zauberwort volatile vorangestellt?
Versuch doch auch mal die Ziffern durch Buchstaben zu ersetzen 1,2,3 --> A,B,C.
Vieelicht liegt der Fehler auch darin, dass Du eine 16Bit Variable just in dem Moment auf das LCD ausgeben willst, wenn die ISR gerade den Wert verändert - Such mal nach ATOMICBLOCK oder atomare Speicherzugriffe. Hört sich zwar unmöglich an, aber auch Programme können in Schwingungen versetzt werden - Ein unscheinbares NOP mehr, und schon kann irgendwo etwas anderes aus dem Takt kommen.

Bei mir sähe das so aus

Code: Alles auswählen


volatile uint16_t wattstunden1 = 0;  // Zähler bis 1000 Wattstunden
volatile uint16_t kilowattstunden1 = 0; //Zähler bis 65535 kWh

in der ISR dann:

if(patt)
{
      uint16_t Tausend = 1000;   // Register mit 1000 laden für mehrere Vergleiche

      if(patt & 1) 
      {
             wattstunden1++;
             if(wattstunden1 > Tausend)
             {
                     kilowattstunden1++;
                     wattstunden1 -= Tausend;
             }
       }
}
Deine Abkürzung, wenn sich nix am Port getan hat, sind meiner Meinung nach nicht notwendige Words im Speicher. Das Alt &= ~Neu und das folgende if(patt) machen das gleiche nochmal.

Zur Timerberechnung: Vielleicht kannste damit was anfangen http://www.roboternetz.de/phpBB2/viewtopic.php?t=53543
ansonsten kann ich Dir nur wärmstens das Buch vom Schmitt empfehlen (isbn usw. s.o). Es gibt nämlich etliche Betriebsarten der Timer/Counter. Und manche Config Bits haben dann wie die Portpins unterschiedliche Bedeutungen (WGM11 --> CTCM1). Das ist in dem Buch schon mal verständlich vorsortiert und beschrieben.

Und klär uns mal auf - Hast Du dafür jetzt ein Webmodul oder ein ETH_M32 am Start?
/Birger
Nach oben

dreamon
Beiträge: 48
Registriert: 01.02.2006, 00:42:32

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von dreamon » 04.05.2010, 16:25:11

Hallo Bilgert,

Ich hab nie behauptet das ich schönen Code Programmiere!!! ;-)

Aber das mit den 1000 umrechnen usw., werd ich nicht in die Timer Rutine tun. Die soll so kurz
wie möglich sein, nicht das sich Timer überschneiden. Jedes Byte ist eines zuviel in der Timer Runtine..
Für deinen Tipp mit dem doppelten if (patt) kann man vermutlich mit switch(){ case 1: } optimieren, bin ich dir dankbar.

Der Zähler zählt absolut sauber, das liegt am Merke&~Muster. Da hab ich lang dran gefeilt.
Nur die steigenden Flanken werden gezählt. Würde ich es nur mit If (Merke!=Muster) würde er auch auf fallende Flanken reagieren. Das will ich nicht.

Die Umrechnung(der Watt/h in kW/h) mach ich wenn dann ganz wo anders, im Hauptprogramm. Im Moment reicht mir bis 65kWh aus. Ich zeichne nur einen Tag auf, und der Rest kommt in einen Monats - Tageszähler und der zeichnet dann ganzen Monat auf. (Summe der 3Zähler)

Aber den Code will ich nicht zeigen. ;-) Weil ich keine Lust habe den schön aufzubereiten und ich noch ständig rumbastle.

Ich hab schon mit dem deklarieren der Variabeln so meine Probleme. Habe die Zähler einfach mit unsigned int deklariert und mit einem Include eingebunden. Ohne das Zauberwort "volatile", welches mir fremd ist.. Üübersetzt -> Heißt es "unwichtig". Na wenns unwichtig ist, dann weg damit. :)

Weißt du zufällig ob es möglich ist Variabeln dauerhaft zu sichern ?
Nach oben

Benutzeravatar
Birgert
Beiträge: 33
Registriert: 15.04.2010, 20:47:13
Wohnort: Kreuzung BAB3 und B470

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von Birgert » 04.05.2010, 21:11:49

Hi draemon;

wenn ich die Codes für die Webmodule anschaue, denke ich "warum so?" Schöner Code ist wohl nur in billigen Büchern zu finden, damit da möglichst viel Seiten bedruckt werden :lol: Lässt sich eben besser lesen. Jeder hat so seine Schwächen oder Vorlieben.
Ich hab nie behauptet das ich schönen Code Programmiere!!!
und ich nie bezweifelt, dass nur schöner Code funktioniert :wink:
Üübersetzt -> Heißt es "unwichtig". Na wenns unwichtig ist, dann weg damit.
volatile heisst nicht unwichtig, sondern flüchtig. Damit wird dem Compiler mitgeteilt, das er vor einer Operation den Inhalt der Variablen neu einlesen soll. Er könnte den Befehl weg optimieren, weil er sich in einer Routine nicht verändert wird. volatile sagt, obachtt, die Variable wird Hardwaremässig oder in einem Interrupt geändert. Wirkt dann wie der Refreshbutton im Browser.
Aber das mit den 1000 umrechnen usw., werd ich nicht in die Timer Rutine tun. Die soll so kurz
wie möglich sein, nicht das sich Timer überschneiden. Jedes Byte ist eines zuviel in der Timer Runtine..
Jetzt stell Dir mal vor, Dein mega hat 'nen Quarz mit 16Mhz. Das bedeutet, dass er theoretisch 16 Millionen Befehle per Sekunde abarbeitet (die meisten Befehle brauchen 1 Takt, Speicherzugriffe (dazu zählen auch absolute Sprünge und Funktionsaufrufe) meistens 2 Takte. In 20 ms sind das immer noch 80000 Befehle.
Wenn Du jetzt den 1000er Übertrag irgendwo in der Hauptschleife machen würdest, musste dort erstmal prüfen, ob sich etwas geändert hat. Und das passiert dann womöglich mehrmals innerhalb von 20 ms. Innerhalb der ISR weisst Du wenigstens, wann Du den Übertrag prüfen musst. Lade Dir mal aus Spaß die Bibliotheken von z.Bsp. dem NiboBee runter, und schau dort mal in die Source Dateien. Dort werden ISR alle 68µs aufgerufen, die wesentlich umfangreicher sind, als das bisschen Zählkram.
Weißt du zufällig ob es möglich ist Variabeln dauerhaft zu sichern ?
Im EEPROM, :wink: in der cmd.c wird z.Bsp die IP-Adresse im EEprom gespeichert oder aus dem EEprom gelesen, Versuche mal dort mit dem Howto zu beginnen. Ansonsten auf mikrocontroller.net gibt's auch ganz nette Tutorials.
Für deinen Tipp mit dem doppelten if (patt) kann man vermutlich mit switch(){ case 1: } optimieren, bin ich dir dankbar.
Mistverständnis befürchtet: ich meinte diese Zeile

Code: Alles auswählen

if (Merke!=Muster)                                           // Abkürzen wenn sich nichts getan hat.
Ich hatte ja ganz oben schon mal ein Snippet gepostet, bei der die Flankenerkennung rein über Logik realisiert ist; wie's aussieht hast Du es etwas anders gelöst. Wenn Du herrausfinden willst, was günstiger ist (if oder switch), müsstest Du bei beiden Varianten die LST-Dateien analysieren (mit eiegenem überschaubaren Testprojekt).

Und was haste denn nu am Start - Webmodul oder ETH_M32? Oder ganz was anderes?
Beim Webmodul wäre ja das Speichern auf SD-Karte möglich. Und irgenwo habe ich mal einen Tipp gesehen, wo jemand den SD-Adapter für eine microSD direkt mit Drähten auf die Platine gelötet hat. Er wechselt dann nur die Mikro-SD aus. Der Adapter dient als Kartenslot.

Na toll, ich bin hier am posten - aber irgendwie überhaupt nicht motiviert den anderen Rechner mit dem AVR Studio einzuschalten. Auf welcher Basisversion hast Du Dich den eingeschossen?
Ich denke, ich werde an der XMegaVersion vom Klaus weiterfeilen, auch auf die Gefahr hin, dass ich Verbesserungen in den Basisversionen von Hand rauspicken und nachführen muß. Oder ich mache etwas eigenes und baue die für mich relevanten Sourcen nachträglich ein.
Hast Du hier irgendwo eine webpage.html Datei zum Runterladen gesehen?
Also viel Spaß und Erfolg noch;
/Birger

P.S. norbert_w hat ja oben auch einen guten Vorschlag gemacht. Dort geht's zwar vornehmlich um das Pollin Board...schon mal angesehen?
Nach oben

dreamon
Beiträge: 48
Registriert: 01.02.2006, 00:42:32

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von dreamon » 05.05.2010, 08:35:42

fergie:

Danke für deinen Input. Hab ich deinen Ansatz richtig verstanden. Du stetz quasi einen Interrupt, wenn sich der Pin/Pins ändern. Das ganze ist aber keine
normale Interrupt-Angelegenheit sondern Timer gesteuert?

Ich hab mich mal vor 20Jahren mit der Materie beschäftigt. Seither hat sich so einiges getan. Schlimm ist, das man so seine Angewohnheiten hat, die es einem schwer machen darüber hinaus zu denken. (liegt am Alter ;-)

Bilgert:
Ich nehm Uli's ETH_M32. Hab aber auch schon ein paar alte Web_server am laufen. Bei regem Zugriff bleiben die aber manchmal hängen.
Das mit dem Abspeichern der Werte werd ich mir reinziehen. Danke.

Mein C ist etwas angestaubt. Warum kann ich keine "unsigned long int" verwenden?
Würde gern die "unsigned int" Zählerstände zusammenzählen und das Ergebnis in eine "unsigned long int" ablegen. Und auch ausgeben. Das klassische uart_write("Monat Watt/s %i:", unsigend long int variabele). zeigt mir nur bis 32768 an.

%li = bringt auch nichts sinnvolles.
%u = auch nichts sinnvolles.

Umrechen wäre nun auch kein Problem, aber eventuell geht es ja einfacher?

Programmiere mit Ubuntu 10.04. Zum Compilieren nehm ich (avr-gcc) gcc-Version 4.3.4 (GCC).
Kann ich wärmstens empfehlen. Alles in der Paketquellen dabei. Ich liebe es. Editor mit geany.

Bilgert:
Könntest du mir die paar Seiten aus dem Buch einscannen? Das mit dem Timer/Interrupt würd ich schon ganz gern mal versehen. Könnten uns eventuell mal per ICQ, Yahoo, MSN in kontakt treten.
Nach oben

Benutzeravatar
Birgert
Beiträge: 33
Registriert: 15.04.2010, 20:47:13
Wohnort: Kreuzung BAB3 und B470

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von Birgert » 05.05.2010, 09:26:52

Bilgert:
Könntest du mir die paar Seiten aus dem Buch einscannen? Das mit dem Timer/Interrupt würd ich schon ganz gern mal versehen. Könnten uns eventuell mal per ICQ, Yahoo, MSN in kontakt treten
Ich heisse Birger -- und nicht google :shock:
Suche dort nach "mikrocomputertechnik schmitt" - Aber das Runterladen und selber Ausdrucken ist mir nicht soviel Mühe wert, als das was das Buch kostet und ich finde, dass der Günter Schmitt ein ausgezeichnetes Buch mit viel Mühe verfasst hat, und gönne ihm jeden Cent, den er damit verdient.
Nach oben

somebuddy
Beiträge: 14
Registriert: 18.12.2012, 20:47:19

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von somebuddy » 19.12.2012, 00:10:12

Hat das denn alles zuverlässig funktioniert ?
Wieviele Impulse wurden im Schnitt verschluckt ?

Ich habe hier einige Zähler liegen und möchte diese ebenfalls loggen.
Glücklich wäre ich mit 3 Zählern.. traumhaft wären 8 :)

Habe dafür folgende Pins auf der Trägerplatine vorgesehen :

Zähler 1-4 = PA0-3
Zähler 5-8 = PD3-6

Die Impulslänge liegt bei den Zählern bei 30ms.

Ist das insgesamt möglich ?

Habt ihr evtl. ein Codebeispiel eurer Implementierung für mich ?
Komme mit Spaghetti Code zurecht ;) muss ja auch nicht öffentlich sein.

dennis-henning@t-online.de

Vielen Dank :)
Nach oben

titimodel72
Beiträge: 3
Registriert: 06.01.2015, 03:19:27

Re: Impulszähler Solaranlage

  • Zitieren

Beitrag von titimodel72 » 07.01.2015, 03:51:31

tief in die Tasche greifen und eine fertige Lösung anschaffen.





samsung galaxy note 4 hülle
Nach oben

Antworten
  • Druckansicht

28 Beiträge
  • Vorherige
  • 1
  • 2

Zurück zu „ETH_M32_EX“



  • Foren-Übersicht
  • Alle Zeiten sind UTC+02:00
  • Alle Cookies löschen

Powered by phpBB® Forum Software © phpBB Limited

Deutsche Übersetzung durch phpBB.de

Datenschutz | Nutzungsbedingungen

 

 

sitemap  |    |  datenschutz   |  impressum