Forum: Mikrocontroller und Digitale Elektronik PIC 10f322- Software soll Folge aus Nullen und Einsen erzeugen


von uC_anfängerin (Gast)


Lesenswert?

Hallo zusammen,

Ich verwende für meinen Projekt den PIC 10f322. Versuche den Pin RA3 als 
Input zu nutzen. Der Pin soll mir eine Folge aus "0" und "1" liefern. 
Das wollte ich mit einem Schalter versuchen. Zb. wenn Schalter offen ist 
"0" ist, Schalter zu ist 1 sein.  Ich will quasi am Pin dran meine 
Software erst mal von außen bis wirkliche restliche Teil da ist mir 
Folge von Nullen und Einsen liefert. Dass ich zumindest mal probieren 
kann neue Routine die mir dann halt ein entsprechend längeres Telegramm 
verschick. Ob das die halsende den Schalter an mache langes Telegramm 
rausschickt.
Wie muss ich hier weiter machen? Wäre das möglich und wie ? Für tipps 
wäre ich sehr dankbar!

Viele Grüße

von ich (Gast)


Lesenswert?

??????????????????????????????????????????????????????????????????

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wenn der Pin A3 ein INPUT ist, wird Dieser kaum '0en und 1sen' ausgeben 
(mit Ausnahme von High Z ohne PushUp und Low).

Gut, Du wirst wohl Pin A3 einlesen und prüfen, ob High oder Low anliegt.

Wo willst Du Das ausgeben?

MfG

@Gast
Bitte lasse Deine Tastatur überprüfen. Nicht, daß Du eines Tages keine 
Fragezeichen mehr vorrätig hast. (maximal Drei davon wären dicke 
ausreichend gewesen)

von Joe F. (easylife)


Lesenswert?

uC_anfängerin schrieb:
> Ob das die halsende den Schalter an mache langes Telegramm
> rausschickt.

Ich empfehle da folgendes:
Tragende fußen Telegramm um plastisch Post.

von uC_anfängerin (Gast)


Lesenswert?

ich schrieb:
> ??????????????????????????????????????????????????????????????????

Sorry aber, was soll das jetzt heißen??

von uC_anfängerin (Gast)


Lesenswert?

Patrick J. schrieb:
> Wenn der Pin A3 ein INPUT ist, wird Dieser kaum '0en und 1sen' ausgeben

Also ich bekomme nachher Daten zu diesem Pin-Input die vom Nullen und 
Einsen entsteht. Da ich aber jetzt diesen System nicht habe, möchte ich 
sozusagen selber erzeugen.
Es tut mir leid wenn ich nicht gut erklären kann :/

von 1N 4. (1n4148)


Lesenswert?

> Sorry aber, was soll das jetzt heißen??

99,999% der Weltbevölkerung verstehen nicht was Dein Anliegen ist :)

von uC_anfängerin (Gast)


Lesenswert?

Joe F. schrieb:
> Tragende fußen Telegramm um plastisch Post.

Ich habe nicht verstanden was du meinst..

von 1N 4. (1n4148)


Lesenswert?

Lerne, dein Problem verständlich zu beschreiben. Das bringt einen 
oftmals auch schon selbst auf mögliche Lösungen.

von uC_anfängerin (Gast)


Lesenswert?

1N 4. schrieb:
> 99,999% der Weltbevölkerung verstehen nicht was Dein Anliegen ist :)

Ja, kann sein dass ich noch Sprachprobleme habe :D und nicht genau 
erklären kann was ich möchte. Dieses Kommentar ist mir weder hilfreich 
noch schädlich, zeit Verschwendung für ihn selbst :/

von uC_anfängerin (Gast)


Lesenswert?

1N 4. schrieb:
> Lerne, dein Problem verständlich zu beschreiben. Das bringt einen
> oftmals auch schon selbst auf mögliche Lösungen.

Stimmt. Werde ich versuchen. Danke dir :)

von Teo D. (teoderix)


Lesenswert?

Taster geht, dauert halt nur bis die Sequenz vollständig ist.
Fraglich wäre ob ein solch langsames zuführen, überhaupt der Sache 
gerächt würde!?

Wie wäre es diese mit einem weiteren PIC zu erzeugen?

von uC_anfängerin (Gast)


Lesenswert?

Teo D. schrieb:
> Taster geht, dauert halt nur bis die Sequenz vollständig ist.
> Fraglich wäre ob ein solch langsames zuführen, überhaupt der Sache
> gerächt würde!?
>
> Wie wäre es diese mit einem weiteren PIC zu erzeugen?

Hmm, meinst du es wird dann die Bit Information zu lang also längeres 
Telegramm weil die Sequenz lange dauert? Ich bin auf diese Idee 
gekommen, aber mit neuem PIC wäre auch eine gute Idee.
Wie könnte man so was hinbekommen?

von Teo D. (teoderix)


Lesenswert?

><(()°>

von uC_anfängerin (Gast)


Lesenswert?

Teo D. schrieb:
>><(()°>

Hmm :/

von H.Joachim S. (crazyhorse)


Lesenswert?

uC_anfängerin schrieb:
> Hmm, meinst du es wird dann die Bit Information zu lang also längeres
> Telegramm weil die Sequenz lange dauert?

Lies bitte mal ganz langsam, was du da schreibst. Und dann überlege 
kurz, wie jemand anderes das verstehen soll.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Bitte versuche erneut, Dein Problem in einfachen Worten uns 
darzustellen.

WOHER kommen die Daten? (mit einem 'hab ich noch nicht' ist's nicht 
getan)
WAS für Daten - und wie schnell sind Diese?
WAS soll mit diesen Daten geschehen?
WO erden diese (verarbeiteten) Daten WIE ausgegeben?

Deine Gedanken kennen wir hier nicht, es ist daher sehr wahrscheinlich, 
daß Du in Deinen Erklärungen Dinge weg lässt, Die für Dich 
selbstverständlich sind - Deren Fehlen bei uns aber dazu führt, daß wir 
keinen Sinn in der Erklärung sehen oder die noch vorhandenen Lücken 
gerne geschlossen wüssten.

MfG

PS: Hier und da ein Komma oder einen Punkt schadet nicht.

: Bearbeitet durch User
von MagIO (Gast)


Lesenswert?

Vielleicht einfach mal zeichnen, wie die Schaltung aussieht und 
markieren was davon noch fehlt. Soll der erwähnte PIC nun das Signal 
erzeugen oder einlesen?
Wenn er es erzeugen soll, wer liest es denn ein?
Welche Information steckt in dem Signal und welches Protokoll wird 
benutzt?

von Witkatz :. (wit)


Angehängte Dateien:

Lesenswert?

uC_anfängerin schrieb:
> Ich bin auf diese Idee
> gekommen, aber mit neuem PIC wäre auch eine gute Idee.
> Wie könnte man so was hinbekommen?

Du müsstet die Bitsequenz auf dem neuen PIC nachbilden, z.B. mit 
__delay_us()
1
    while(1){
2
        LATAbits.LATA0 = 1;
3
        __delay_us(1000);
4
        LATAbits.LATA0 = 0;
5
        __delay_us(19000);
6
        // usw.
7
    }
Andere Möglichkeit wäre, dein Programm im Simulator zu testen und die 
Bitsequenz im Stimulus nachzubilden, s. Bild

von uC_anfängerin (Gast)


Lesenswert?

Patrick J. schrieb:
> WOHER kommen die Daten? (mit einem 'hab ich noch nicht' ist's nicht
> getan)
> WAS für Daten - und wie schnell sind Diese?
> WAS soll mit diesen Daten geschehen?
> WO erden diese (verarbeiteten) Daten WIE ausgegeben?

Die Daten werden vom einem Messsystem zum Pin RA3 kommen. Ich möchte 
aber jetzt erst mal probieren mit einem Taster eine Folge aus Nullen und 
Einsen zu liefern zu RA3.
Mein erster schritt was ich machen muss ist das. Ich weiß es noch nicht 
wie schnell die Daten sind. Soweit bin ich noch nicht. Ich wollte nur 
wissen wie das möglich ist.

von uC_anfängerin (Gast)


Lesenswert?

MagIO schrieb:
> Wenn er es erzeugen soll, wer liest es denn ein?

Ich wollte mit nem Oszi gucken, was ich am RA3 bekomme

von Witkatz :. (wit)


Lesenswert?

uC_anfängerin schrieb:
> Teo D. schrieb:
>>><(()°>
>
> Hmm :/

Teo heisst Gott und Fisch ist das Erkennungszeichen der Zeugen Jehowas 
;-)

Manchmal werden auch unliebsame Forenmitglieder mit Fischen beworfen, 
aber das trifft hier mit an Wahrscheinlichkeit grenzender Sicherheit 
nicht zu.

uC_anfängerin schrieb:
> Ich möchte
> aber jetzt erst mal probieren mit einem Taster eine Folge aus Nullen und
> Einsen zu liefern zu RA3.

Mit einem Taster kannst du nur Nullen und Einsen abwechselnd erzeugen, 
das wird kein sinnvolles Protokoll sein. Bei einer 1-Draht Übertragung 
ist das Timing des Signals das entscheidende und das kannst du per 
Handtaster nicht nachbilden. Welches Protokoll oder welcher Sensor soll 
das sein? Hast du dir das Datenblatt des Sensors mit Timingtabellen des 
Protokolls angeschaut?

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

uC_anfängerin schrieb:
> Die Daten werden vom einem Messsystem zum Pin RA3 kommen. Ich möchte
> aber jetzt erst mal probieren mit einem Taster eine Folge aus Nullen und
> Einsen zu liefern zu RA3.
> Mein erster schritt was ich machen muss ist das. Ich weiß es noch nicht
> wie schnell die Daten sind. Soweit bin ich noch nicht. Ich wollte nur
> wissen wie das möglich ist.

Wird es eine asynchrone (vermutlich) Daten Übertragung sein?  So was: 
https://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter

Oder eine synchrone Datenübertragung mit einem zusätzlichen Taktsignal:
https://de.wikipedia.org/wiki/Serial_Peripheral_Interface
https://en.wikipedia.org/wiki/I%C2%B2C

Schau dir die Bilder/Diagramme mit dem Zeitverhalten an und lies die 
Texte dazu!

von Kai S. (mallequalle)


Lesenswert?

Ein nicht entprellter Taster liefert viele Nullen und Einsen, oder gern 
auch mal ein unbeschalteter ADC. Bei letzterem muß man halt noch ein 
wenig „if…then“ oder „select…case“ programmieren (ADC<512 -> null bzw. 
ADC>512 -> eins, je nach Auflösung), einem Output-Pin den so ermittelten 
Zustand zuweisen auf den Input-Pin zurückführen und auswerten lassen. 
Die Menge der so generierten Ziffern kann man in einer 
"for…next"-Schleife begrenzen, damit das Telegramm  nicht zu lang wird 
:D (Array oder „wachsende Zeichenkette“: string += '0' oder string += 
'1'), die man dann wieder in einzelne Zeichen zerlegt.

Hm. Versteht mich jemand? :) Habe ich die Frage verstanden? :):):)

von Joe F. (easylife)


Lesenswert?

Kai S. schrieb:
> Versteht mich jemand?

öhm, nicht wirklich.

Zunächst muss man ja mal rausfinden, was für ein Interface das später 
angeschlossene Messsystem überhaupt verwendet. UART ist da sehr 
wahrscheinlich.
Einen UART kann man mit einem Taster aber nicht simulieren.
Ein SPI Interface schon eher (mit 2-3 Tastern/Schaltern).

Und einen UART würde man dann auch nicht "von Hand" implementieren, 
sondern das nutzen, was der Mikrocontroller von Hause aus zu bieten hat.

von MagIO (Gast)


Lesenswert?

Also verstehe ich das richtig, der PIC ist schon da, nur das, was am Pin 
RA3 angeschlossen ist noch nicht?
Dann könntest du doch den Teil, der eigentlich die Bits vom Port 
ausliest erst mal so programmieren, dass es die Bits aus dem Speicher 
holt.
Wenn du schon über Taster nachgedacht hast, dann kann es dir ja nicht um 
das Timing gehen.
Wenn das Timing wichtig ist, dann einen 2. PIC z.B. auf einem Steckbrett 
so programmieren, dass er das entsprechende Signal erzeugt. Dann macht 
auch in dieser Phase das Ozilloskop Sinn. Mit dem Oszi zu schauen, was 
du mit dem Taster machst ist ziemlich Nutzlos.

von uC_anfängerin (Gast)


Lesenswert?

Witkatz :. schrieb:> Mit einem Taster kannst du nur 
Nullen und Einsen abwechselnd erzeugen


Also nochmal.. versuche mich besser auszudrücken. Bisher kann mein uC 
immer so eine 32 Bit (Impulse) + Pause 32 Bit + Pause.. verschicken. Ich 
möchte aber, dass ich die Möglichkeit habe von außen in den uC z.B 32 
Byte reinspeichern kann, nacher dann auch raus lesen kann. Für diesen 
Betrieb werde ich später eine Teil bekommen, wo es mir nullen und Einsen 
liefert.(Deswegen dachte ich,dass ich es mit einem Taster Nullen/Einsen 
hinbekommen kann) Wenn mein uC merkt, aha da will mich jemand 
kommunizieren und bekomme nullen und Einsen, schaltet dann Betrieb um 
gibt den 32 Byte raus (FLASH Speicher).
Ich habe jetzt erfahren, dass es nicht unbedingt wie ich gedacht habe, 
ein Taster mir 1en 0en erzeugen soll, sondern kann das auch so 
geschehen:

Wenn Taster gedrückt-> Lese 32 Byte Flash Speicher und gebe aus (noch 
nicht Implementiert)
Wenn Taster !gedrückt-> Gib mir den 32 Bit+Pause raus (die schon 
implementiert ist).

Wie ich aber die nicht Implementierte Funktion hinbekommen werde, weiß 
ich nicht genau und bräuchte dafür Hilfe.

Ich dachte zb:

btfss PORTA, 3  ; ist der Schalter 'gedrückt' Ja Loop1, Nein Loop
goto Loop; hier ist der Fall dass es mir 32 Bit gibt
goto Loop1 ; und hier der Fall wenn mir die Flash lesen soll?

Wie kann ich Flash Speicher lesen? Hat das mit EECON1 zutun?

von Günter Lenz (Gast)


Lesenswert?

uC_anfängerin schrieb:
>Versuche den Pin RA3 als
>Input zu nutzen.

Dann arbeitet der Pin als Eingang, du kannst da zum Beispiel
einen Taster anschließen.

>Der Pin soll mir eine Folge aus "0" und "1" liefern.

"liefern" bedeutet, der Pin arbeitet als Ausgang, dafür mußt
du dann einen anderen Pin benutzen und könntest da dann
zum Beispiel eine LED anschließen.
Wenn dieser Pin eine Folge von "0" und "1" liefern soll,
mußt du ein Programm schreiben, daß dies macht. So etwas
sind meistens die ersten Schritte bei Anfängern, also
die LED blinken lassen. Man sagt dazu auch, am Pin wackeln.

von Joe F. (easylife)


Lesenswert?

Ganz abgesehen von was auch immer auf dem Pin passieren soll, tue dir 
einen Gefallen und nimm für die Programmierung C und nicht Assembler.

Das erhöht deine Chancen Antworten auf deine vermutlich noch zahlreichen 
Fragen zu bekommen enorm...

uC_anfängerin schrieb:
> Bisher kann mein uC
> immer so eine 32 Bit (Impulse) + Pause 32 Bit + Pause.. verschicken. Ich
> möchte aber, dass ich die Möglichkeit habe von außen in den uC z.B 32
> Byte reinspeichern kann, nacher dann auch raus lesen kann. Für diesen
> Betrieb werde ich später eine Teil bekommen, wo es mir nullen und Einsen
> liefert.

Du musst dir mal ganz grundsätzlich klar werden, dass eine 
Datenübertragung eine Synchronisierung zwischen Sender und Empfänger 
erfordert.
Einfach mal "Nullen und Einen verschicken" gibt es nicht.
Entweder gibt es noch weitere Signalleitungen (z.B. eine Clock), oder 
ein festes Timing, und Synchronisationsbits (wie z.B. bei UART / RS232 
etc).

Ohne zu wissen, was man hier eigentlich machen möchte, braucht man gar 
nicht erst anfangen.

: Bearbeitet durch User
von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

@ uC_anfängerin

Hallo,

Ich versuche mal Dein Problem in klaren Worten fassen, wenigstens so wie 
ich es verstanden habe:

1. Du hast an Deinem PIC10F322 RA3 Als Input eingestellt (konfiguriert).
2. Du willst mit dem Taster an RA3 High-Pegel (Einsen) und Low-Pegel 
(Nullen) eingeben
3. Du willst erreichen, dass der PIC auf Tasterdruck 32Bits ausgibt, 
nämlich die eingespeicherten Nullen und Einsen.
4. Wenn die gespeichetten Nullen und Einsen ausgegeben werden sollen 
gibt es 2 Möglichkeiten:
a) der PIC zählt mit und gibt die Bits aus sobald 32 erreicht sind
   oder
b) Ein weiterer Taster löst die Ausgabe von 32Bits aus.

Eine Bitte: Stelle doch bitte Deinen bisherigen Code hier im Forum ein, 
dann sieht man vielleicht eher, was Du erreichen möchtest und wie man 
Dir helfen kann.

mfg
Ottmar

P.S. Bei der Eingabe mit Taster bitte beachten:
 * RA3 mit Widerstand 10kOhm nach +5V schalten (Pullup)
 * Alle mechanischen Kontakte, auch die eines Tasters prellen!
 * Tasteranschluss mit RC-Tiefpass entprellen. Das Schaltbild ist nur 
ein Beispiel, Cx kann mit ca. 22nF bis 47nF gewählt werden

von Joe F. (easylife)


Lesenswert?

Ottmar K. schrieb:
> 2. Du willst mit dem Taster an RA3 High-Pegel (Einsen) und Low-Pegel
> (Nullen) eingeben

Was kann dabei herauskommen, wenn man nur einen Taster hat, ausser 
10101010101010101010?

Wie gibt man denn 00 oder 11 ein?

von Ottmar K. (wil1)


Lesenswert?

Das reicht jedenfalls fürs Erste um einfach mal 32 bit in den PIC zu 
bekommen. Der/die steht doch noch ganz am Anfang!!

mfG Ottmar

von Dieter K. (dikomoe)


Angehängte Dateien:

Lesenswert?

uC_anfängerin schrieb:
> .(Deswegen dachte ich,dass ich es mit einem Taster Nullen/Einsen
> hinbekommen kann)

Ein Taster ist wohl die ungünstigste Methode, um eine Bitfolge zu 
erzeugen. Wäre es nicht sinnvoll, sich mit einem CD4093 (4 NAND-Gatter), 
einem Widerstand und einem Kondensator einen Frequenzgenerator zu bauen?
Der liefert natürlich nur 010101...-Folgen, aber hat eine konstante 
Frequenz, kein Prellen und so eine Folge lässt sich uC-intern leicht 
erfassen, indem der Eingangspegel im gleichen Takt der Frequenz jeweils 
in Bit-Mitte abgefragt wird. Ein Oszilloskop ist allerdings 
erforderlich.
Ich habe ein Programm angehängt, das die serielle Schnittstelle RS232 
abfragt. Vielleicht ist dein Problem ähnlich.
Viel Erfolg!

von uC_anfängerin (Gast)


Lesenswert?

Günter Lenz schrieb:
> liefern" bedeutet, der Pin arbeitet als Ausgang, dafür mußt
> du dann einen anderen Pin benutzen und könntest da dann
> zum Beispiel eine LED anschließen.
> Wenn dieser Pin eine Folge von "0" und "1" liefern soll,
> mußt du ein Programm schreiben, daß dies macht. So etwas
> sind meistens die ersten Schritte bei Anfängern, also
> die LED blinken lassen. Man sagt dazu auch, am Pin wackeln.

Okay, versuche dann anders zu formulieren wenn es mit "liefern" nicht 
geklappt hat :). Zu schwer zu erläutern :(. Also am pin RA3 wird später 
Signale empfangen, die vom einem Messsystem verschickt wird. Dieses 
Signal hat dann ein bestimmte Bitmuster zb 01101000. Nach dem der uC 
diesen Muster empfangen hat, sagt der aha jemand redet mit mir und 
schickt am Ausgangspin seine Flash-Speicher den der hat, z.B 00 01 02 
06...FF.  Dies wird nach der Methode wie ich 32 Bits schon rauschicken 
kann, gemacht werden.

So jetzt zurück zum Thema Schalter. Ich muss jetzt keinen Nullen und 
Einsen erzeugen, sondern, es wurde mir gesagt, es reicht, wenn ich nur 
'0' und '1' am PIN Eingang bekomme. Der Schalter ist da, als ob ich den 
wirklichen Teil die mir Bitmuster zb 01101000 verschickt und somit den 
Zustand ändert.

Meine frage wäre hier jetzt, wie ich Flash Speicher lese?

Ansonsten hat sich ja erledigt, dass ich keine nullen und Einsen 
erzeugen muss.. Dies wird von einem Teil mir erzeugt, die ich später in 
meinem Programm ändern muss.

von uC_anfängerin (Gast)


Lesenswert?

Joe F. schrieb:
> Gefallen und nimm für die Programmierung C und nicht Assembler.

für die Programmierung muss ich leider Assembler nehmen :(

von uC_anfängerin (Gast)


Lesenswert?

uC_anfängerin schrieb:
> Okay, versuche dann anders zu formulieren wenn es mit "liefern" nicht
> geklappt hat :). Zu schwer zu erläutern :(. Also am pin RA3 wird später
> Signale empfangen, die vom einem Messsystem verschickt wird. Dieses
> Signal hat dann ein bestimmte Bitmuster zb 01101000. Nach dem der uC
> diesen Muster empfangen hat, sagt der aha jemand redet mit mir und
> schickt am Ausgangspin seine Flash-Speicher den der hat, z.B 00 01 02
> 06...FF.  Dies wird nach der Methode wie ich 32 Bits schon rauschicken
> kann, gemacht werden.
>
> So jetzt zurück zum Thema Schalter. Ich muss jetzt keinen Nullen und
> Einsen erzeugen, sondern, es wurde mir gesagt, es reicht, wenn ich nur
> '0' und '1' am PIN Eingang bekomme. Der Schalter ist da, als ob ich den
> wirklichen Teil die mir Bitmuster zb 01101000 verschickt und somit den
> Zustand ändert.
>
> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?
>
> Ansonsten hat sich ja erledigt, dass ich keine nullen und Einsen
> erzeugen muss.. Dies wird von einem Teil mir erzeugt, die ich später in
> meinem Programm ändern muss.

Hallo Joe,

vielen Dank für deine Ausführliche schreiben. Ich habe da oben nochmal 
beschrieben was ich haben will. Kannst du vllt dort schauen?

uC_anfängerin schrieb:
> Okay, versuche dann anders zu formulieren wenn

von 1N 4. (1n4148)


Lesenswert?

> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?

Kenne zwar PICs aber nicht deren Assembler, aber im Prinzip: Adresse der 
Speicherstelle in ein Register schreiben und dann den Wert der dadurch 
adressierten Speicherstelle ausgeben (wohin auch immer). Wie Werte im 
Flash-Speicher werden im Assembler-Listing an einer bestimmten 
Startadresse abgelegt.

von uC_anfängerin (Gast)


Lesenswert?

Dieter K. schrieb:
> Ein Taster ist wohl die ungünstigste Methode, um eine Bitfolge zu
> erzeugen. Wäre es nicht sinnvoll, sich mit einem CD4093 (4 NAND-Gatter),

Ja genau, da hast du recht. Deswegen, mache ich jetzt mit keine Folge 
aus 0en und 1en sondern, der Eingangspin fragt ab, ob es 0 oder 1 ist. 
Später wenn der fehlende Teil da ist die mir z.B 01101010 erzeugt, werde 
ich mit meinem Programm anpassen.

von uC_anfängerin (Gast)


Lesenswert?

1N 4. schrieb:
>> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?
>
> Kenne zwar PICs aber nicht deren Assembler, aber im Prinzip: Adresse der
> Speicherstelle in ein Register schreiben und dann den Wert der dadurch
> adressierten Speicherstelle ausgeben (wohin auch immer). Wie Werte im
> Flash-Speicher werden im Assembler-Listing an einer bestimmten
> Startadresse abgelegt.

Muss ich hier dann erst mal mir den Datenblatt anschauen?

von 1N 4. (1n4148)


Lesenswert?

> Muss ich hier dann erst mal mir den Datenblatt anschauen?

Es ist nie falsch, das Datenblatt von einem Bauteil, welches man 
verwendet, zu lesen. Und am besten ein Buch über 
PIC10-Assemblerprogrammierung.

von Ottmar K. (wil1)


Lesenswert?

> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?

Speichern im Flash (Allgemeines, Lesen, Schreiben) ist beim PIC10F322 
nicht möglich, da bleibt nur das EEPROM. Siehe dazu das Datenblatt des 
10F322 und zum Vergleich das Datenblatt zum PIC16F877 )vgl. "3.0 DATA 
EEPROM AND FLASH
PROGRAM MEMORY", auch "3.6 Writing to Flash Program Memory"

und natürlich nicht zu vergessen:

http://www.sprut.de/electronic/pic/grund/eeprom.htm#Fallgemein

mfG Ottmar

von uC_anfängerin (Gast)


Lesenswert?

1N 4. schrieb:
>> Muss ich hier dann erst mal mir den Datenblatt anschauen?
>
> Es ist nie falsch, das Datenblatt von einem Bauteil, welches man
> verwendet, zu lesen. Und am besten ein Buch über
> PIC10-Assemblerprogrammierung.

Danke dir, werde auf jeden Fall machen und mir auch ein Buch besorgen.

von uC_anfängerin (Gast)


Lesenswert?

Ottmar K. schrieb:
>> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?
>
> Speichern im Flash (Allgemeines, Lesen, Schreiben) ist beim PIC10F322
> nicht möglich, da bleibt nur das EEPROM. Siehe dazu das Datenblatt des
> 10F322 und zum Vergleich das Datenblatt zum PIC16F877 )vgl. "3.0 DATA
> EEPROM AND FLASH
> PROGRAM MEMORY", auch "3.6 Writing to Flash Program Memory"
>
> und natürlich nicht zu vergessen:
>
> http://www.sprut.de/electronic/pic/grund/eeprom.ht...
>
> mfG Ottmar

Vielen Dank Ottmar. Ich werde mich morgen damit beschäftigen und 
versuche zu verstehen. Falls ich was nicht weiter komme, melde ich mich 
bei euch :)

Gute Nacht

von Thomas E. (picalic)


Lesenswert?

Ottmar K. schrieb:
> Speichern im Flash (Allgemeines, Lesen, Schreiben) ist beim PIC10F322
> nicht möglich,

Doch, das geht!

Ottmar K. schrieb:
> da bleibt nur das EEPROM.

Nein, der 10F322 hat kein EEPROM, sondern nur Flash.

Wie man Daten aus dem Flash liest oder dort 'rein schreibt, steht im 
Datenblatt, Kapitel 9: "Flash Program Memory Control"

: Bearbeitet durch User
von Günter Lenz (Gast)


Lesenswert?

Hier ist eine interessante Seite über
PIC-Microcontroller-Grundlagen

http://www.sprut.de/

von Cyborg (Gast)


Lesenswert?

Da es sich wohl um Schule handelt, warum fragst du nicht deinen Lehrer?
Dir was beizubringen ist nämlich sein Job.

von Ottmar K. (wil1)


Lesenswert?

@ Thomas Elger

>> Speichern im Flash (Allgemeines, Lesen, Schreiben) ist beim PIC10F322
>> nicht möglich,

>Doch, das geht!

...Wenn Du Recht hast, dann hast Du recht - hab es nachgelesen:

Lesen, Schreiben im Flash des PIC10F322 ist möglich!

...zumindest geht die Diskussion jetzt in die richtige Richtung...

mfG Ottmar

von Volker S. (vloki)


Lesenswert?

uC_anfängerin schrieb:
> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?

Wenn es wirklich erforderlich ist dann z.B. mit dem Befehl retlw
Damit könntest du eine Tabelle aufbauen in der zu jedem Resultat des 
empfangenen Bitmusters eine passende Antwort liegt. Das nennt man Lookup 
Table. So -> http://www.hobbyprojects.com/pic_tutorials/tutorial10.html

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Gerade als Anfänger sollte man nicht versuchen direkt Code zu hacken.
Sondern man schreibt sich erstmal den Programmablaufplan in Worten auf. 
Und erst, wenn der logisch funktioniert, kann man mit Code schreiben 
anfangen.

von Dieter K. (dikomoe)


Lesenswert?

uC_anfängerin schrieb:
> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?

Das Schreiben und Lesen aus dem Flash Speicher ist bei den PICs nicht 
der Normalfall, wenn man von dem relativ simplen "table read" mit dem 
retlw-Befehl absieht, für den aber die zu lesenden Daten bereits Teile 
des Programmcodes sein müssen.
Meine Frage ist, warum willst (oder musst) du den Flash Speicher 
benutzen und nicht den Data Speicher (RAM)?
Ansonsten kann ich dir nur wärmstens empfehlen, die Seiten von "sprut" 
zu studieren.

von Thomas E. (picalic)


Lesenswert?

Dieter K. schrieb:
> Das Schreiben und Lesen aus dem Flash Speicher ist bei den PICs nicht
> der Normalfall

Naja, PICs gibt es ja viele verschiedene Typen, und wenn man nicht 
gerade so einen "Rechenboliden", wie unsere Anfängerin benutzt/benutzen 
muss, ist der Zugriff auf das Flash bei den modernen PIC1xF1xxx 
(Enhanced Midrange Familie) deutlich schmerzfreier, als auf der 
diesbezüglich doch etwas veralteten  Sprut-Seite beschrieben.
Bei den EM-PICs kann man die beiden FSR-Register als Zeiger auf das 
Flash benutzen und so sehr einfach Daten aus dem Flash lesen - 
zumindest, wenn es sich um 8 Bit breite Daten handelt, z.B. mit diesen 
Befehlen:
[code]
   movf INDF0,W         ;lädt Daten, auf die FSR0 zeigt
   moviw [FSR0]         ;(wie oben)
   moviw OFFSET[FSR0]   ;Adresse = Inhalt (FSR0) + konst.OFFSET
   moviw ++[FSR0]       ;FSR0 wird vor dem Zugriff incrementiert
   moviw --[FSR0]       ;FSR0 wird vor dem Zugriff decrementiert
   moviw [FSR0]++       ;FSR0 wird nach dem Zugriff incrementiert
   moviw [FSR0]--       ;FSR0 wird nach dem Zugriff decrementiert
[code]
Microchip bezeichnet das als "C Compiler optimized", was fast ein wenig 
suggeriert, als hätten die Befehle bei ASM-Programmierung keinen großen 
Nutzen.
Für wortweisen (14-bit) Zugriff muss man aber nach wie vor den Umweg 
über EEADR bzw. PMADR und Controlregister gehen.

: Bearbeitet durch User
von Erich (Gast)


Lesenswert?

uC_anfängerin schrieb:
> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?

Lesen ging wohl einfacher, aber schreiben und lesen ist was anderes.
Ob das mit dem hier verwendeten kleinen PIC überhaupt möglich ist habe 
ich jetzt nicht nachgelesen.

Selbst wenn es ginge, wäre es für "uC_anfängerin" keine sinnvolle 
Erstaufgabe.

Gruss

von Dieter K. (dikomoe)


Lesenswert?

Thomas E. schrieb:
> Naja, PICs gibt es ja viele verschiedene Typen, und wenn man nicht
> gerade so einen "Rechenboliden", wie unsere Anfängerin benutzt/benutzen
> muss, ist der Zugriff auf das Flash bei den modernen PIC1xF1xxx
> (Enhanced Midrange Familie) deutlich schmerzfreier, als auf der
> diesbezüglich doch etwas veralteten  Sprut-Seite beschrieben.

Ich bin wohl diesbezüglich auch schon etwas veraltet, denn ich bin über 
den PIC16F87X nicht hinausgekommen. Das Datenblatt des PIC10F322 widmet 
dem Thema Flash Program Memory Control ein 11-seitiges Kapitel, das man 
sich nicht eben mal schnell reinzieht. Für mich bleibt die entscheidende 
Frage: Warum kann nicht das 64-Byte umfassende Data Memory genutzt 
werden??? Mich interessiert auch die Frage, warum es gerade dieser 
Controller sein soll, der ja allerhand kann, aber einen erstaunlich 
kleinen Flash Program Memory hat.

von uC_anfängerin (Gast)


Lesenswert?

Thomas E. schrieb:
> atenblatt, Kapitel 9: "Flash Program Memory Control"

Da, beschäftige ich mich gerade :)
Ich kann glaube ich jetzt den Flash Speicher lesen. Nun möchte ich an 
einem Pin ausgeben und mit Oszi gucken, ob es geklappt hat. Ich kann 
zeigen, wie ich Flash Speicher lese:

 #define Daten PORTA,2  ;Ausgangspin

 PROG_ADDR_HI equ 0xFD
 PROG_ADDR_LO equ 0x11D
 PROG_DATA_HI equ 0x61
 PROG_DATA_LO equ 0x62

movlw PROG_ADDR_LO ; speichere PROG_ADDR_LO (Geringwertiges Byte Adresse 
des Programmspeichers) in W register
    movwf PMADRL       ; kopiere W in PMADRL Register (LSB der Adresse 
speichern)
    movlw PROG_ADDR_HI ; speichere PROG_ADDR_HI in W register
    movwf PMADRH       ; kopiere W in PMADRH Register
    bcf   PMCON1,CFGS ; CFGS=0 Zugriff Flash program memory
    bsf   PMCON1, RD  ; RD=1  Beginnt Programm Flash lesen
    NOP
    NOP

    movf  PMDATL, W   ; W enthält Data LOW die gelesen wird
    movwf PROG_DATA_LO ; W in PROG_DATA_LO kopieren
    movf  PMDATH, W    ; W enthält Data High die gelesen wird
    movwf PROG_DATA_HI ; W in PROG_DATA_HI kopieren
    goto  Ausgabe


Kann mir jemand sagen, ob es soweit richtig ist?

von uC_anfängerin (Gast)


Lesenswert?

Dieter K. schrieb:
> warum es gerade dieser
> Controller sein soll,

Ist wirklich nicht meine Entscheidung :/

von uC_anfängerin (Gast)


Lesenswert?

Erich schrieb:
> esen ging wohl einfacher, aber schreiben und lesen ist was anderes.

Ich hoffe, dass ich schritt für schritt alles lerne :)

von uC_anfängerin (Gast)


Lesenswert?

Thomas E. schrieb:
> Für wortweisen (14-bit) Zugriff muss man aber nach wie vor den Umweg
> über EEADR bzw. PMADR und Controlregister gehen.

Ich habe mal was versucht mithilfe vom Datenblatt was zu programmieren. 
Ich möchte 32 Byte Daten vom Flash Speicher lesen. Wäre dann mein Code 
so in Ordnung?

uC_anfängerin schrieb:
> define Daten PORTA,2  ;Ausgangspin

Ab hier könntest du schauen, wenn du Zeit hast.
Vielen Dank!

von uC_anfängerin (Gast)


Lesenswert?

Dieter K. schrieb:
> retlw-Befehl

Ich habe was versucht zu programmieren, habe es auch oben gepostet, wäre 
so was der richtige Weg?

Dieter K. schrieb:
> warum willst (oder musst) du den Flash Speicher

Später muss ich Flash Speicher auch schreiben können, viellicht 
deswegen? Obwohl RAM kann man auch schreiben und lesen. Weiss ich nicht 
warum. Macht das ein Unterschied?

von uC_anfängerin (Gast)


Lesenswert?

Günter Lenz schrieb:
> Hier ist eine interessante Seite über
> PIC-Microcontroller-Grundlagen
>
> http://www.sprut.de/

Danke, da schaue ich mir immer gerne nach

von uC_anfängerin (Gast)


Lesenswert?

Volker S. schrieb:
> uC_anfängerin schrieb:
>> Meine frage wäre hier jetzt, wie ich Flash Speicher lese?
>
> Wenn es wirklich erforderlich ist dann z.B. mit dem Befehl retlw
> Damit könntest du eine Tabelle aufbauen in der zu jedem Resultat des
> empfangenen Bitmusters eine passende Antwort liegt. Das nennt man Lookup
> Table. So -> http://www.hobbyprojects.com/pic_tutorials/tutorial10.html

Genau, so was würde mir sehr helfen. Danke Dir!

von Sven B. (scummos)


Lesenswert?

1N 4. schrieb:
>> Sorry aber, was soll das jetzt heißen??
>
> 99,999% der Weltbevölkerung verstehen nicht was Dein Anliegen ist :)

Gut, das gilt fairerweise auch dann, wenn die Frage zum gleichen Thema 
klar formuliert ist ;)

von Thomas E. (picalic)


Lesenswert?

Servus,

uC_anfängerin schrieb:
>> define Daten PORTA,2  ;Ausgangspin
>
> Ab hier könntest du schauen, wenn du Zeit hast.

das Programmstück sieht schon so aus, als würde es ein Datenwort aus dem 
Flash lesen - und da es die 1:1 Kopie von "Example 9-1" aus dem 
Datenblatt ist, sollte es wohl auch funktionieren.

Aber wo hast Du denn diese Werte her?
> PROG_ADDR_HI equ 0xFD
>  PROG_ADDR_LO equ 0x11D

Das müssen doch 8-bit Werte sein, und 0x11D passt schonmal nicht in 8 
Bits.
Und das höherwertige Byte der Adresse soll 0xFD sein, wo der Controller 
doch nur 512 Words Programmspeicher hat? Die höchste Adresse ist laut 
Datenblatt 0x1FF (Kapitel 2.0 "Memory Organisation", Tabelle 2-1).

von uC_anfängerin (Gast)


Lesenswert?

Thomas E. schrieb:
> Das müssen doch 8-bit Werte sein, und 0x11D passt schonmal nicht in 8
> Bits.
> Und das höherwertige Byte der Adresse soll 0xFD sein,

Ich möchte doch nicht alles lesen was im Flash Speicher ist, sondern nur 
32 Byte. Da habe ich mir vom Program Memory mir angeschaut, wo noch 
nicht beleg ist, und dann die beiden Adressen mir ausgewählt die 32 Byte 
entspricht.

Line  Adresse Opcode
254   0FD     3FF      PROG_ADDR_LO
.
.
.
286   11D      3FF     PROG_ADDR_HI

Thomas E. schrieb:
>  PROG_ADDR_HI equ 0xFD
>> PROG_ADDR_LO equ 0x11D

Ups, hier war es umgekehrt.

Ich dachte in diese beiden Registern (PMADRH:PMADRL) muss ich die 
Adresse kopieren, die ich lesen möchte. Deswegen:

movlw PROG_ADDR_LO
movwf PMADRL

oder verstehe ich hier Falsch?

von uC_anfängerin (Gast)


Lesenswert?

Thomas E. schrieb:
> Das müssen doch 8-bit Werte sein, und 0x11D passt schonmal nicht in 8
> Bits.

0x11D entspricht in Binärsystem 1000 1110 1 Und es gibt die zwei 
Registern
PMADRL:PROGRAM MEMORY ADDRESS LOW und PMADRH: PROGRAM MEMORY ADDRESS 
HIGH
da passt es doch 0x11D rein?

von Thomas E. (picalic)


Lesenswert?

Da hast Du etwas missverstanden: PMADRL und PMADRH geben keinen 
SpeicherBEREICH (Anfangs-Endadresse) für den Flash-Zugriff an, sondern 
sind jeweils 8 Bit Register, die die unteren 8 Adressbits (Bit 0..7 in 
PMADRL), und die höherwertigen Adressbits (Bit 8..15 in PMADRH) für den 
Zugriff auf EINE Speicherzelle enthalten. Da bei 512 Speicherzellen die 
höchste Adresse 0x1FF ist, steht im PMADRH-Register sinnvoll also nur 0 
oder 1.

uC_anfängerin schrieb:
> 0x11D entspricht in Binärsystem 1000 1110 1
Die Schreibweise ist etwas unüblich und auch unpraktisch.
Wenn Du Binärzahlen in 4-Bit Gruppen notierst, solltest Du es nach 
rechts ausrichten, also 0x11D = 1 0001 1101
(Bei Dezimalzahlen mit Leerzeichen zwischen Dreiergruppen schreibt man 
Einemilliondreihundertzweiundachzigtausendfünfhundertzehn ja auch nicht
"138 251 0"
sondern
"1 382 510".

uC_anfängerin schrieb:
> da passt es doch 0x11D rein?

Die Register im PIC haben 8 Bit, eine 9-bit lange Zahl passt da 
garantiert nicht rein.

: Bearbeitet durch User
von uC_anfängerin (Gast)


Lesenswert?

Thomas E. schrieb:
> sind jeweils 8 Bit Register, die die unteren 8 Adressbits (Bit 0..7 in
> PMADRL), und die höherwertigen Adressbits (Bit 8..15 in PMADRH) für den
> Zugriff auf EINE Speicherzelle enthalten.

Aha, verstehe.
Also wenn ich dann auf einen Adressbits Zugreifen möchte die 
511 = b 1 1111 1111 ist, wird Bit 8 in PMADRH und Bit 0-7 in PMADRL 
gespeichert?

Da ich aber 32 Byte lesen möchte, habe ich dann lese Bereich geändert 
und ab 0xCB (8 Bit) bis 0xEA (8 Bit) geschrieben. In diesem Fall brauche 
ich dann PMADRH nicht weil es schon in PMADRL rein passt, stimmt's?
also ohne PROG_ADDR_HI:

PROG_ADDR_LO equ 0xCB

movlw PROG_ADDR_LO
movwf PMADRL

Wie kann ich aber dann die andere Speicherbeireiche lesen also bis zum 
0xEA?
Geht das dann mit retlw?

z.B     movlw 0xCB
        call Tabelle
           .
           .
        Tabelle addwf PC
        retlw CC
        retlw CE
        retlw CF

          .
        retlw  EA

von Thomas E. (picalic)


Lesenswert?

uC_anfängerin schrieb:
> Also wenn ich dann auf einen Adressbits Zugreifen möchte die
> 511 = b 1 1111 1111 ist, wird Bit 8 in PMADRH und Bit 0-7 in PMADRL
> gespeichert?

Ja.

uC_anfängerin schrieb:
> In diesem Fall brauche
> ich dann PMADRH nicht weil es schon in PMADRL rein passt, stimmt's?

Nicht ganz - es könnte ja sein, daß irgend eine vorher durchgeführte 
Aktion PMADRH mit 1 geladen hat. Du solltest also besser explizit eine 0 
ins PMADRH-Register laden.

uC_anfängerin schrieb:
> Wie kann ich aber dann die andere Speicherbeireiche lesen also bis zum
> 0xEA?

Indem Du vor jeder neuen Leseoperation die Leseadresse (d.h. den Inhalt 
des Registerpaars PMADRH:PMADRL) incrementierst.

uC_anfängerin schrieb:
> Geht das dann mit retlw?
>
> z.B     movlw 0xCB
>         call Tabelle
>            .
>            .
>         Tabelle addwf PC
>         retlw CC
>         retlw CE
>         retlw CF

Nein! Bitte mach Dir mal Schritt für Schritt klar, was die einzelnen 
Befehle genau tun und wie diese "Lookup"-Tabelle funktioniert. Wenn Dir 
etwas nicht klar ist, lass es im SIM Schritt für Schritt ablaufen und 
beobachte, was passiert - das ist mitunter auch sehr lehrreich!

von uC_anfängerin (Gast)


Lesenswert?

Thomas E. schrieb:
> Aktion PMADRH mit 1 geladen hat. Du solltest also besser explizit eine 0
> ins PMADRH-Register laden.

Okay, damit das nicht 1 geladen wird, soll ich 0 laden. Aber wenn das 
nicht implementiert ist, ließt es nicht 0 ?

In dem ich so schreibe PROG_ADDR_HI equ 0x00 wird dann richtig?
Sieht mein Programm so besser aus :(


PROG_ADDR_LO equ 0xCB
PROG_ADDR_HI equ 0x00

movlw PROG_ADDR_LO
movwf PMADRL
movlw PROG_ADDR_HI
movwf PMADRH

bcf   PMCON1,CFGS ; CFGS=0 Zugriff Flash program memory bsf   PMCON1,
INCF PMADRH,1
INCF PMADRL,1
RD  ; RD=1  Beginnt Programm Flash lesen
NOP
NOP
movf  PMDATL, W   ; W enthält Data LOW die gelesen wird
movwf PROG_DATA_LO ; W in PROG_DATA_LO kopieren
movf  PMDATH, W    ; W enthält Data High die gelesen wird
movwf PROG_DATA_HI ; W in PROG_DATA_HI kopieren
goto  Ausgabe


   Du hattest mal oben doch noch geschrieben, wie das funktionieren 
könnte. Was bedeutet moviw? Den Befehl sehe ich zum ersten mal, habe 
auch nachgeschaut nicht gefunden hier : 
http://www.sprut.de/electronic/pic/assemble/pseudo.html

Thomas E. schrieb:
>    movf INDF0,W         ;lädt Daten, auf die FSR0 zeigt
>    moviw [FSR0]         ;(wie oben)
>    moviw OFFSET[FSR0]   ;Adresse = Inhalt (FSR0) + konst.OFFSET
>    moviw ++[FSR0]       ;FSR0 wird vor dem Zugriff incrementiert
>    moviw --[FSR0]       ;FSR0 wird vor dem Zugriff decrementiert
>    moviw [FSR0]++       ;FSR0 wird nach dem Zugriff incrementiert
>    moviw [FSR0]--       ;FSR0 wird nach dem Zugriff decrementiert
>   [code]

Vielen dank, dass du dir die Zeit nimmst und mir hilfst! Da ich sehr neu 
mit uC bin, stolpere über jeden Stein :/

von uC_anfängerin (Gast)


Lesenswert?

uC_anfängerin schrieb:
> goto  Ausgabe

ich habe jetzt ausprobiert, und die beiden müssen vor dem goto Ausgabe, 
sonnst macht es kein Sinn. Sorry, dass ich falsch gemacht hatte :/
    incf PMADRL,1
    incf PMADRH,1

von uC_anfängerin (Gast)


Lesenswert?

uC_anfängerin schrieb:
> incf PMADRL,1
>     incf PMADRH,1

auch wieder Falsch!

von Dieter K. (dikomoe)


Lesenswert?

Thomas E. schrieb:
> Indem Du vor jeder neuen Leseoperation die Leseadresse (d.h. den Inhalt
> des Registerpaars PMADRH:PMADRL) inkrementierst.

Zum Lesen von 32 Bytes aus dem Flash musst du eine Schleife 
programmieren, die 32 mal durchlaufen wird. Entsprechend musst du einen 
Zähler laden. Am Beginn gibst du die Anfangsadresse ein, dann erfolgt 
die Leseoperation für ein Byte, dann wird die Adresse erhöht, der Zähler 
dekrementiert und an den Beginn der Leseoperation gesprungen.
Für die auszulesenden Daten musst du einen Bereich im RAM reservieren 
und den dann über indirekte Adressierung mit Hilfe des FSR beschreiben.

Schema:  Flash-Adresse laden (2 Bytes)
         Zahler mit 32 laden
Loop     Leseoperation
         Daten im RAM speichern(siehe oben)
         Zähler dekrementieren
         Zahler = 0? Ja: Ende, nein: weiter
weiter   Flash-Adresse inkrementieren
         zu Loop
Ende     .......

Das Registerpaar wird so inkrementiert:
     incfsz   PMADRL,1
     goto     Loop
     incf     PMADRH,1

PS: Die Lookup-Methode setzt voraus, dass die auszulesenden Daten in 
Form von retlw- Befehlen vorliegen mit dem Datenwert im w-Register

von Thomas E. (picalic)


Lesenswert?

uC_anfängerin schrieb:
> Du hattest mal oben doch noch geschrieben, wie das funktionieren
> könnte. Was bedeutet moviw?

Sorry, lass Dich davon bitte nicht verwirren - den Befehl movwi u.a. 
gibt es in der "Enhanced Midrange" PIC Familie (hatte ich ja auch 
geschrieben).
Da Du aber Dein Projekt mit dem 10F322 realisieren sollst, der zur 
"Baseline"-Familie gehört, brauchst Du da nicht weiter zu suchen.

uC_anfängerin schrieb:
> Okay, damit das nicht 1 geladen wird, soll ich 0 laden. Aber wenn das
> nicht implementiert ist, ließt es nicht 0 ?

Tatsächlich wird PMADRH beim Reset durch die Hardware auf 0 gesetzt (Die 
Reset-Werte zu jedem Register stehen im Datenblatt). Wenn Du also sicher 
weisst, daß Deine Daten nie über Adresse 255 hinausgehen, kannst Du das 
PMADRH Registers auch ignorieren. In der Regel ist sowas aber 
Sparsamkeit am falschen Platz und provoziert Fehler. Irgendwann 
erweiterst Du (oder jemand anders?) vielleicht das Programm mal und 
speicherst ein paar Daten an höheren Adressen. Erfahrungsgemäß vergisst 
man dabei leicht mal (oder rechnet nicht damit), daß der "alte" 
Programmteil nur mit dem LSB der Adresse hantiert und wundert sich dann 
über merkwürdige Fehler in Programmteilen, die eigentlich bereits prima 
funktioniert hatten und gar nicht verändert wurden...

uC_anfängerin schrieb:
> PROG_ADDR_LO equ 0xCB
> PROG_ADDR_HI equ 0x00

Ein Tipp: definiere die Adresse ruhig als 16-bit Wert und überlass die 
Teilung in High- und Lowbyte dem Assembler, z.B.
1
#define PROG_ADDR 0x123
2
3
   ....
4
    movlw high PROG_ADDR
5
    movwf PMADRH
6
    movlw low PROG_ADDR
7
    movwf PMADRL

: Bearbeitet durch User
von Dieter K. (dikomoe)


Lesenswert?

uC_anfängerin schrieb:
> Später muss ich Flash Speicher auch schreiben können, viellicht
> deswegen? Obwohl RAM kann man auch schreiben und lesen. Weiss ich nicht
> warum. Macht das ein Unterschied?

Im Flash-Speicher steht normalerweise dein Programm (zumindest im 
unteren Teil). Abgesehen vom Lookup ist ein Zugriff auf den 
Flash-Speicher ein Sonderfall. (Mir bisher seit ca. 18 Jahren noch nicht 
vorgekommen). Lesen einer Zelle aus dem Flash erfordert etwa 12 Befehle. 
Schreiben ist noch komplizierter. Lesen bzw. Schreiben aus dem oder in 
das RAM erfordert jeweils 2 Befehle. Das ist ein beachtlicher 
Unterschied.

von Thomas E. (picalic)


Lesenswert?

Es gibt natürlich noch einen kleinen, aber für die Anwendung ggf. nicht 
ganz unerheblichen Unterschied zwischen RAM und Flash (bzw. EEPROM): den 
RAM-Inhalt "vergisst" der Microcontroller, sobald man ihn ausschaltet, 
das Flash oder EEPROM ist nicht flüchtig!

Auf der anderen Seite hat RAM, neben dem Vorteil des schnelleren 
Zugriffs (beim 10F322 ist es nur ein Befehl - BANKSEL entfällt, weil der 
nur eine Bank hat) auch den Vorteil, daß es beliebig oft mit neuen 
Werten überschrieben werden kann. Wenn Flash oder EEPROM-Daten jede 
Sekunde geändert werden, ist der Speicher mit seinen 10K-100K 
Schreibzyklen bald hinüber.
Aber nur unsere TO weiß (oder auch nicht?), welche Art von 
Datenspeicherung für ihre Applikation notwendig ist - sollte sie 
zumindest wissen - ohne klare Definition der Aufgabe ist eine korrekte 
Lösung nicht möglich!
"Obwohl RAM kann man auch schreiben und lesen. Weiss ich nicht warum." 
kann jedenfalls kein Dauerzustand sein und bedarf dringend einer 
Klärung.

von Dieter K. (dikomoe)


Lesenswert?

Thomas E. schrieb:
> Aber nur unsere TO weiß (oder auch nicht?), welche Art von
> Datenspeicherung für ihre Applikation notwendig ist - sollte sie
> zumindest wissen - ohne klare Definition der Aufgabe ist eine korrekte
> Lösung nicht möglich!

Dem kann ich nur zustimmen. Schade, dass bis jetzt nicht klar ist, 
welche Aufgabe der PIC zu übernehmen hat. Anfangs war die Rede von 
seriellen Daten, die an RA3 empfangen werden sollen. Dann ging es auf 
einmal um das Lesen aus dem Flash-Speicher und einer Ausgabe an RA2. 
Woher der Flash-Speicher seine Daten hat, welcher Art sie sind und was 
mit ihnen geschehen soll, bleibt im Dunklen.
Liebe uC-Anfängerin, beschreibe doch bitte mal die gesamte Aufgabe, 
damit man dir vielleicht besser helfen kann!

von Jess M. (uc_beginner)


Lesenswert?

Dieter K. schrieb:
> Schema:  Flash-Adresse laden (2 Bytes)
>          Zahler mit 32 laden
> Loop     Leseoperation
>          Daten im RAM speichern(siehe oben)
>          Zähler dekrementieren
>          Zahler = 0? Ja: Ende, nein: weiter
> weiter   Flash-Adresse inkrementieren
>          zu Loop
> Ende     .......
>
> Das Registerpaar wird so inkrementiert:
>      incfsz   PMADRL,1
>      goto     Loop
>      incf     PMADRH,1
>
> PS: Die Lookup-Methode setzt voraus, dass die auszulesenden Daten in
> Form von retlw- Befehlen vorliegen mit dem Datenwert im w-Register

Hey,

nach deinem Schema habe ich versucht was zu Programmieren. Das mit RAM 
Bereich reservieren, habe ich nicht so ganz verstanden. Muss ich für 
jede gelsene Daten im RAM speichern?

Mein Code sieht so aus:

Start  nop

    call PortA_Init
    call Timer_Init
    call read_Flash

   read_Flash
    movlw high Prog_addr
    movwf PMADRH         ;9 Bit Speicheradresse, wo es anfängt an zu 
lesen.
    movlw low Prog_addr
    movwf PMADRL

    movlw B'00100000' ; Zähler=32 laden
    movwf Zaehler

Loop

    bcf PMCON1,CFGS
    bsf PMCON1, RD

    movf PMDATL,W
    movwf PROG_DATA_L
    movf PMDATH,W
    movwf PROG_DATA_H
    ;movwf INDF  ; indirekte adressierung
    incf FSR

    decf Zaehler,1
    decfsz Zaehler ;ist Zähler=0?
    call weiter  ; nein
    return 0     ;ja



    weiter incfsz PMADRL,1
           incf PMADRH,1
           goto Loop

Dieter K. schrieb:
> incf     PMADRH,1

ich denke es muss vor der Loop sein, sonnst springt der schon bevor 
PMADRH um 1 inkrementiert wird. Oder nicht?

von Jess M. (uc_beginner)


Lesenswert?

Danke, ich habe jetzt genau verstanden,was PMADRH und PMADRL macht. Habe 
auch mit andere Adresse ausprobiert die 8 Bit ist und den unterschied 
mit MPLAB SIM gesehen.

von Jess M. (uc_beginner)


Lesenswert?

Dieter K. schrieb:
> Lesen einer Zelle aus dem Flash erfordert etwa 12 Befehle.
> Schreiben ist noch komplizierter. Lesen bzw. Schreiben aus dem oder in
> das RAM erfordert jeweils 2 Befehle. Das ist ein beachtlicher
> Unterschied.

Macht dann schon viel aus..Ja, ich frage dann wieso ich nicht RAM lesen 
und schreiben kann.

von Jess M. (uc_beginner)


Lesenswert?

Thomas E. schrieb:
> ohne klare Definition der Aufgabe ist eine korrekte
> Lösung nicht möglich!

Dieter K. schrieb:
> Liebe uC-Anfängerin, beschreibe doch bitte mal die gesamte Aufgabe,
> damit man dir vielleicht besser helfen kann!
´
Okay,ich versuche euch nochmal schön zu beschreiben, was die Aufgabe 
ist. Soll ich ein neuer Beitrag erstellen oder können auch mailen. Weil 
ich immer unterschiedliche Fragen habe und passt dann zum Thread nicht.

von Thomas E. (picalic)


Lesenswert?

Hallo Jess,

Jess M. schrieb:
> Okay,ich versuche euch nochmal schön zu beschreiben, was die Aufgabe
> ist. Soll ich ein neuer Beitrag erstellen oder können auch mailen.

ich denke, damit alle, die hier mitlesen und evtl. Tipps geben wollen, 
eine bessere Vorstellung haben, wie Deine Anwendung konkret aussieht, 
ist es sinnvoller, wenn Du es hier im Forum beschreibst.

von Cyborg (Gast)


Lesenswert?

Jess M. schrieb:
> Okay,ich versuche euch nochmal schön zu beschreiben, was die Aufgabe
> ist.

Hoffentlich können alle die Anspannung ertragen. ;-b

> Soll ich ein neuer Beitrag erstellen oder können auch mailen.

Sollte das ein Frage sein, dann schließt man den Satz mit einem
Fragezeichen ab und nicht mit einem Punkt. Privatunterricht
würde ich sein lassen, weil der ja dann recht isoliert
und dann von anderen nicht mehr verfolgbar wäre.

> Weil
> ich immer unterschiedliche Fragen habe und passt dann zum Thread nicht.

Dein Grundlagenwissen ist so gering, dass natürlich dann viel
zu fragen ist. Wenn du dich per Internet erst mal fundierter schlau
machen würdest, hättest du sicher deutlich weniger (nervige) Fragen.

von Ottmar K. (wil1)


Lesenswert?

Hallo,

Inzwischen interessiert mich dieses Thema 'Lesen, Schreiben, 
Modifizieren' des Programmspeichers doch sehr, indem ich mich nun das 
erste Mal damit beschäftige. Ist ja mal eine richtige Aufgabe sich da 
reinzufinden und ein funktionsfähiges Programm zu stricken.

Für den, den es interessiert, habe ich mal das Grundlegende aus dem 
Datenblatt des PIC10F322 zusammengefasst. Dazu ist zu sagen, dass dies 
nicht gerade eine Aufgabe für einen Anfänger ist.

Hinzu kommt noch, dass in den Beispielcodes des Datenblattes OPCODE und 
Instruktionen  wie z.B. moviw FSR++ (nicht nur das) vorkommen, die diese 
MCU gar nicht kennt, was für einen 'newbie' zusätzliche Anforderungen 
bedeutet

Also hier mal zusammengefasst, was für 'Lesen, Schreiben, Modifizieren' 
an Code für den Programmkern fällig ist:

;*********************************************************************
; Quelle: Datenblatt DS41585A Microchip Technology Inc.
;
; 9.2.1 READING THE FLASH PROGRAM MEMORY
; To read a program memory location, the user must:
; 1. Write the desired address to the PMADRH:PMADRL register pair.
; 2. Clear the CFGS bit of the PMCON1 register.
; 3. Then, set control bit RD of the PMCON1 register
;
; 9.2.2 FLASH MEMORY UNLOCK SEQUENCE
; The unlock sequence is a mechanism that protects the Flash program
; memory from unintended self-write programming or erasing. The
; sequence must be executed and completed without interruption to
; successfully complete any of the following operations:
; • Row Erase
; • Load program memory write latches
; • Write of program memory write latches to program memory
; • Write of program memory write latches to UserIDs
; The unlock sequence consists of the following steps:
; 1. Write 55h to PMCON2
; 2. Write AAh to PMCON2
; 3. Set the WR bit in PMCON1
; 4. NOP instruction
; 5. NOP instruction
;
; 9.2.3
; ERASING FLASH PROGRAM MEMORY
; While executing code, program memory can only be erased by rows.
; To erase a row:
; 1. Load the PMADRH:PMADRL register pair with any address within the
;    row to be erased.
; 2. Clear the CFGS bit of the PMCON1 register.
; 3. Set the FREE and WREN bits of the PMCON1 register.
; 4. Write 55h, then AAh, to PMCON2 (Flash programming unlock sequence).
; 5. Set control bit WR of the PMCON1 register to begin the erase 
operatio
;
; 9.2.4 WRITING TO FLASH PROGRAM MEMORY
; Program memory is programmed using the following steps:
; 1. Load the address in PMADRH:PMADRL of the row to be programmed.
; 2. Load each write latch with data.
; 3. Initiate a programming operation.
; 4. Repeat steps 1 through 3 until all data is written.
;
; 9.3 Modifying Flash Program Memory
; When modifying existing data in a program memory row, and data within
; that row must be preserved, it must first be read and saved in a RAM
; image. Program memory is modified using the following steps:
; 1. Load the starting address of the row to be modified.
; 2. Read the existing data from the row into a RAM image.
; 3. Modify the RAM image to contain the new data to be written into
;    program memory.
; 4. Load the starting address of the row to be rewritten.
; 5. Erase the program memory row.
; 6. Load the write latches with data from the RAM image.
; 7. Initiate a programming operation.
;*********************************************************************

mfG Ottmar

von Dieter K. (dikomoe)


Lesenswert?

Jess M. schrieb:
> Macht dann schon viel aus..Ja, ich frage dann wieso ich nicht RAM lesen
> und schreiben kann.

Es besteht wohl Übereinstimmung, dass der Umgang mit dem Flash-Speicher 
für eine Anfängerin nicht der geeignete Einstieg in die 
PIC-Programmierung ist. Deshalb hier noch mal meine Frage an Jess: Ist 
für dein Projekt das Lesen und Schreiben des Flash-Speichers wirklich 
nötig? Bevor man nicht selbst per Programm etwas hineingeschrieben hat, 
kann man doch nur Daten lesen, die beim Brennen des Programms 
hineingeschrieben wurden.

Wenn ich nicht dringend müsste, würde ich den Flash-Speicher nicht 
beschreiben. Bisher hatte ich keinen Grund dazu.

@ Ottmar
> Hinzu kommt noch, dass in den Beispielcodes des Datenblattes OPCODE und
> Instruktionen  wie z.B. moviw FSR++ (nicht nur das) vorkommen, die diese
> MCU gar nicht kennt, was für einen 'newbie' zusätzliche Anforderungen
> bedeutet
>
Komisch: in meinem Datenblatt DS40001585D sind solche Anweisungen nicht 
drin.

von Ottmar K. (wil1)


Lesenswert?

Dieter K. schrieb:
> Komisch: in meinem Datenblatt DS40001585D sind solche Anweisungen nicht
> drin.

Ohne Dich wäre ich nicht drauf gekommen - Mein Datenblatt war von 2011 
veraltet - habe nun das aktuelle DS in den Händen!

mfG Ottmar

von Dieter K. (dikomoe)


Lesenswert?

@ Ottmar
Hallo, Ottmar,
ich befasse mich auch erstmals mit diesem Thema. Ich habe den PIC10F322 
nicht und auch keinen dafür geeigneten Programmer. Deshalb versuchte ich 
es mit der Simulation mit MBLAB IDE v.8.92. Es funktioniert aber nicht. 
Ist es eventuell so, das MBLAB SIM die im Datenblatt dargestellten 
Zugriffe auf den Programmspeicher nicht unterstützt?

Besten Gruß
Dieter

von Ottmar K. (wil1)


Lesenswert?

Hallo Dieter,

Ich habe mir das Programmsbeispiel aus dem Datenblatt vorgenommen. Auch 
ich habe keinen 10F322 und komme da mit dem Simulator nicht weiter. Ich 
bleibe aber dran und sobald ich wieder mal bei Reichelt bestelle, lasse 
ich mir einen 10F322 zusenden.

mfG Ottmar

von Thomas E. (picalic)


Angehängte Dateien:

Lesenswert?

Servus,

es liegt wohl daran, daß der 10F322 relativ modern ist und noch nicht 
voll vom Simulator in MPLAB 8 unterstützt wird. Ich habe das angehängte 
Programm sowohl im MPLAB 8.92, als auch im MPLAB X simuliert. Im MPLAB 8 
liest der Sim nur Nullen aus dem Flash, während im MPLAB X tatsächlich 
die Flash-Daten ins RAM kopiert werden.

von Witkatz :. (wit)


Lesenswert?

Thomas E. schrieb:
> das angehängte Programm

Zeile 40
1
bsf   INTCON,GIE     ; Disable interrupts
müsste hier nicht bcf hin?

von Thomas E. (picalic)


Lesenswert?

Witkatz :. schrieb:
> müsste hier nicht bcf hin?

Ja, stimmt - Tippfehler.

von Dieter K. (dikomoe)


Lesenswert?

@ Thomas
Hallo, Thomas,

besten Dank für das Programm test10F322.asm. Damit müsste uC-Anfängerin 
eigentlich zu Potte kommen, wenn sie es nachvollzieht. Ich habe 
allerdings die folgenden Zeilen nicht verstanden:

>FLASHDATA code FLASH_ADDR
>  dw  0x555,0x123,0x456,0x000,0xABC
>  dw  0x333,0x444,0x555,0x666,0xAAA

Das Programm gelangt dort auch gar nicht hin. Was bedeuten sie?

Beste Grüße
Dieter

von Volker S. (vloki)


Lesenswert?

Die sind dafür da, den Flash beim Brennen mit irgendwas sinnvollem zu 
füllen. Das kann man dann später, wenn das Programm läuft, auslesen ;-)

: Bearbeitet durch User
von Thomas E. (picalic)


Lesenswert?

Volker S. schrieb:
> Die sind dafür da, den Flash beim Brennen mit irgendwas sinnvollem zu
> füllen.

Naja - sinnvoll sind die Daten hier ja nicht gerade! ;)
Ja, das sind irgendwelche Phantasiedaten, damit das Testprogramm halt 
irgenwas anderes, als gelöschte (=0x3FFF) Flash-Speicherzellen 
vorfindet.

Was ich nochmal gerne 'rausfinden würde: Warum werden im Datenblatt beim 
Example 9-1 (Flash Program Memory Read) die Interrupts nicht gesperrt, 
wohl aber bei Example 9-4 (dessen Code ich für meinen Test 'rauskopiert 
habe)?

Ist mir auch in anderen Datenblättern schon aufgefallen, daß manchmal 
zum Lesen von Flash oder EEPROM die Interrupts nicht gesperrt werden. 
Bei Microchip weiß man nie so richtig, ob es sich nur eine 
Copy&Paste-Relikt handelt, wie bei Example 9-3:
   "BTFSC  INTCON,GIE  ;See AN576
    GOTO  $-2",
oder tatsächlich notwendig ist.

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Thomas E. schrieb:
> Was ich nochmal gerne 'rausfinden würde: Warum werden im Datenblatt beim
> Example 9-1 (Flash Program Memory Read) die Interrupts nicht gesperrt,
> wohl aber bei Example 9-4

Hmm, eigentlich braucht man das doch nur, damit die Unlock-Sequenz nicht 
unterbrochen wird. Beim Lesen braucht man die ja nicht, also würde ich 
auch auf einen Copy-Paste Effekt tippen.

von Dieter K. (dikomoe)


Lesenswert?

Liebe Thread-Beobachter,
am 11.05. hat sich die Thread- Urheberin letztmalig gemeldet und mir 
scheint, als ob es das letzte Mal war.
Obwohl ich das Thema Flash Program Memory Control für eigene Projekte 
nicht brauche, da ich keine PICs mit dieser Fähigkeit verwende, 
interessiert es mich doch, zu wissen, wofür es erforderlich ist, 
insbesondere die unter den  Adressen 2000h bis 2003H und 2006h 
enthaltenen ID-Daten auszulesen und - soweit möglich - neu zu 
beschreiben. Ich kann mir bestenfalls vorstellen, das so etwas einmalig 
gemacht wird (wozu auch immer), aber als ständig sich wiederholende 
Routine in einem Programm scheint es mir ohne erkennbaren Sinn. So etwas 
Ähnliches hatte Jess offenbar vor, obwohl ich ihre Aufgabenstellung nie 
richtig verstanden habe.

Beste Grüße
Dieter

von Thomas E. (picalic)


Lesenswert?

Hallo Dieter,

es gibt durchaus einige Gründe, das Programm-Flash zu beschreiben, z.B. 
damit ein Bootloader im PIC verwendet werden kann, der dann dem 
Endanwender/Kunden erlaubt, über eine Schnittstelle ein Firmware-Update 
einzuspielen. Auch die User ID-Daten könnten in solch einem Bereich 
verwendet werdem, z.B. um die Firmware zu identifizieren o.ä. - wie Du 
schon vermutest, wird sowas natürlich in der Regel nur einmal 
einprogrammiert.
Eine andere Anwendung ist der Ersatz von Daten-EEPROM durch 
Flash-Speicher. Viele PICs (so auch der 10F322) haben kein EEPROM, um 
nicht-flüchtige Daten zu speichern, dafür aber einen Flash-Bereich, der 
dafür vorgesehen ist und für eine erhöhte Anzahl von Schreibzyklen 
ausgelegt ist ("High Endurance Flash").
Das Lesen von Daten aus dem Flash hat auch seine Anwendungen. Im 
Gegensatz zu Lookup-Tabellen mit "retlw"-Befehlen, kann man so immerhin 
14 Bits pro Speicherzelle ablegen und kann auch viel mehr als 256 
Elemente verwalten. Bei PICs, die noch keinen "BRW"-Befehl kennen, muss 
man mit den retlw-Tabellen auch aufpassen, daß die Tabelle keine 256er 
Pagegrenze überschreitet, d.h. Anfang und Ende der Tabelle müssen auf 
derselben Page liegen.

von Dieter Kohtz (dikomoe) (Gast)


Lesenswert?

Hallo, Thomas,

danke für Deine ausführliche Antwort. Nun weiß ich wenigstens Bescheid 
und bin für mich sicher, dass ich mich mit dem Thema nicht wieder 
beschäftigen muss. Für meine Projekte sind die "veralteten" PICs zum 
Glück völlig ausreichend.

MfG
Dieter

von Jess M. (uc_beginner)


Lesenswert?

Dieter K. schrieb:
> am 11.05. hat sich die Thread- Urheberin letztmalig gemeldet

Guten Morgen zusammen,

ich könnte mich letzten Tagen leider  bei euch melden. Bin aber wieder 
da!

Thomas E. schrieb:
> Programm sowohl im MPLAB 8.92, als auch im MPLAB X simuliert.

Thomas, vielen vielen Dank, dass du ausprobiert hast und dir die mühe 
gemacht hast. Ich habe auch noch selber weiter ausprobiert gehabt. Ich 
werde mich jetzt heute damit weiter beschäftigen und dein Code mir 
anschauen.

Sobald ich versucht habe melde ich mich wieder!

von Thomas E. (picalic)


Lesenswert?

Hallo Jess,

Jess M. schrieb:
> Ich
> werde mich jetzt heute damit weiter beschäftigen und dein Code mir
> anschauen.

beachte/korrigiere bitte den Fehler, den Witkatz reportet hat, ich kann 
den Anhang ja leider nicht mehr korrigieren!
(Ist zwar für Deine Anwendung wahrscheinlich irrelevant, aber trotzdem 
blöd, wenn das Programm das Gegenteil von dem macht, was im Kommentar 
steht...)

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.