Forum: Mikrocontroller und Digitale Elektronik I2C Monitor mit Mega8


von Philipp (Gast)


Lesenswert?

Hallo,

ist es möglich mittels des Hardware TWI einen einfachen I2C Monitor mit
dem Mega8 zu realisieren? Er sollte mir alle Daten die auf dem Bus
laufen inklusive Adresse zB über die serielle Schnittstelle ausgeben.
Habe im Datenblatt leider nix dazu gefunden, wie ich den Mega8 so
konfigurieren kann das er auf alle Adressen reagiert. Hat das mal
jemand gemacht oder hat sonst eine Idee wie ich einen einfachen I2C
Monitor realisieren könnte?

Vielen Dank
Gruß Philipp

von Peter D. (peda)


Lesenswert?

Nein, das geht nur mit HW-I2C ohne Adreßerkennung, z.B. wie im
ATTiny2313.


Peter

von Hauke Sattler (Gast)


Lesenswert?

Ich habe mir mal sowas auf einem Mega8 gecodet(weil ich diesen noch
rumliegen hatte)
Benutzt jedoch dir nicht das HW-TWI modul
Erkennt start, stop, Ackn und nAckn bedingungen und gibt die zusammen
mit den Adressen/Daten über eine 115kBaud RS232 raus.
Hab aber schon ewig nicht mehr damit gearbeitet.
Meld dich einfach falls du das gebrauchen kannst.

cu
Hauke

von Philipp (Gast)


Lesenswert?

meld :)

Das wäre super wenn dur mir das zukommen lassen könntest.

Vielen Dank schonmal
Gruß Philipp

von Philipp (Gast)


Lesenswert?

Achso. schafft dein Mega8 damit auch 200KHz? so schnell scheint der Bus
hier zu laufen.

Bin schon gespannt :)

Schönes Wochenende
Gruß Philipp

von Hauke Sattler (Gast)


Lesenswert?

200 khz geht leider in der vorliegenden Version nicht, weil der rs232
mit 115kBaud zu langsam wäre.
Ich hatte mal mit einer version mit einem ft245 usb wandlerchip (bis zu
8Mbaud) angefangen. Hab die aber nicht fertig gemacht. Hatte andere
Projekte.

cu
Hauke

von Philipp (Gast)


Lesenswert?

Ist das Programm in C oder ASM? es kommen ja nicht viele Nachrichten.
eiegntlich nur 2-3 und dann ist wieder ruhe. also wenn man das buffert
sollte es gehen.

Kannst du mir deine Ergebnisse mal zur Verfügung stellen?

Gruß Philipp

von Hauke Sattler (Gast)


Lesenswert?

Das programm ist in asm, und noch recht krude programmiert (war eines
meiner sehr frühen programme)
Ich müßte mal durchtesten ob das auch mit 200kHz fubbt

cu
Hauke

von Philipp (Gast)


Lesenswert?

könntest du es mir zum testen mal zur verfügung stellen? wenn du nicht
den source hergeben möchtest würde ja auch das hex file reichen.

Vielen Dank
Gruß Philipp

von Michael (Gast)


Lesenswert?

Hätte ich auch gerne !!! Kannste das nicht in die codesammlung stellen
?
Gruss Michael

von 123 (Gast)


Lesenswert?


von Hauke Sattler (Gast)


Angehängte Dateien:

Lesenswert?

Ok

Ich habe mich nochmal an den Code drangesetzt und die größten Sünden
ausgebügelt.
Habe noch den FIFO verbessert.

Das Ding läuft jetzt auf nem Mega8 @ 14.7456MHz.

So wie es aussieht sind 200 kHz SCL jetzt kein Problem mehr.
Früher ware lediglich 50kHz drin (wegen dem UART).

Anschlüsse wären:
PD2 = SCL
PD3 = SDA
PD7 = INT

RS232 Parameter:
115.200 Baud
8 Datenbit
keine Parität
1 Stoppbit

Beispiel der Datenausgabe:
Start
s41aE0aC1np

s  = Start condition
41 = Adresse ($40 im lesemodus)
a  = Acknowledged
E0 = übertragene Daten
a  = Acknowledged
C1 = übertragene Daten
n  = not Acknowledged
p  = Stop condition

cu
Hauke

von Hauke Sattler (Gast)


Lesenswert?

P.S.

INT ist nur eine Interuptleitung welche mitüberwacht wurde.
i = Interrupt auf low gesprungen
I = Interrupt auf high gesprungen

cu
Hauke

von Philipp (Gast)


Lesenswert?

Super. FIFO klingt für mich nach einem Buffer oder sehe ich das Falsch?
Obwohl eigentlich würden sonst die 200KHz ja auch nicht gehen.

Kann es leider noch nicht testen, weil ich nur einen 11,059 MHz quarz
da hab für korrekte 115K2

Vielen Dank schonmal, da müsste genau das sein was ich gesucht habe.

Schönes Wochenende
Gruß Philipp

von Hauke Sattler (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal auf 11.0592MHz gepatcht.

Funktion ohne Gewähr.

cu
Hauke

von Philipp (Gast)


Lesenswert?

Hat funktioniert mit 11,0592 war genau das was ich gesucht hatte und hat
mir sehr geholfen.

Vielen Dank
Gruß Philipp

von Sven F. (sven0876)


Lesenswert?

Mal herauskramen
dieser sniffer wäre genau das was ch zur zeit suchen würde nur hab ich 
ein problem bei mir kommen wilde ausgaben und keine klaren i²c daten auf 
der rs232 an. problem könnte sein das mein atmega 8 mit 5v läuft und der 
I2c bus mit 0/3,3v weis jemand hier rat?

mfg sven

von Philipp (Gast)


Lesenswert?

:) gerade gestern habe ich diesen Thread auch rausgekramt um mal wieder 
am Bus zu horchen. Habe es zuhause gerade aufgebaut und es funktioniert. 
Allerdings ein 5V Bus. Der Sniffer ist echt super hilfreich.

Wenn du möchtest kann ich ja mal die Spannung etwas runterteilen und 
schauen ob es mit rund 3V auch noch funktioniert.

Gruß Philipp

von Sven F. (sven0876)


Lesenswert?

wäre klasse hab aber schon das problem das mein atmega8 sendet ohne das 
überhaupt ein iic bus vorhanden ist und dort solte er doch gar nix 
machen oder? evtl pullup down nötig? betreibe ihn auf eienm stk500 board

danke sven

von Philipp C. (ba4_philipp)


Lesenswert?

Ja auf einen definierten Pegel musst du die Pins schon bringen. Was 
genau geht denn nicht bei dir? Teste doch sonst einfach erstmal ob du 
mit den 3,3V aus deinem System da diese Interrupt Leitung ansprechen 
kannst.

Gruß Philipp

von Sven F. (sven0876)


Lesenswert?

Problem bei mir ist schon das ich wilde ausgaben auf der rs232 seite 
bekomme selbst wenn gar kein i²c bus angeschlossen ist. un dich die 
eingänge auf gnd via 1kohm lege. evtl fuses im spiel? aber die werden 
doch bei der hex datei mit gesetzt wenn ich micht recht entsinne.

sven

von Hauke S. (hauke)


Lesenswert?

Moin

Nun schalte ich mich mal wieder ein.

Immer wenn ich den Sniffer einsetze, habe habe ich 2MOhm Pullups am M8 
dranhängen.

So zum reinen testen der UART verbindung kannst du ja mal den I²C Bus 
abklemmen. Und dann PD2 PD3 und PD7 an VCC hängen (über je einen 1kOhm 
Widerstand)
Nach dem Reset sollte der M8 das Wort "Start <CR>" an das Terminal 
Prtogramm senden.
Wenn dies schon nicht funtioniert, dann stimmt was an der UART 
übertragung nicht.
Entweder falscher Quarz oder UART-Teiler Einstellung.
Oder Falsche parameter im Terminalprogramm (Parity,Stopbit Baudrate)

Wenn das "Start" nach dem Reset immer sauber rauskommt, dann schaun wir 
mal weiter.

cu
Hauke

von Sven F. (sven0876)


Lesenswert?

ok alles vergessen das war abolute dummheit von mir!!!!
hab jetzt zwar kein gerät da zum sniffen aber es solte gehen....

mein fehler hatten nen atmega32 parallel mit im stk das konnte nicht 
gehen!!!

melde mich sobald das sniffen geklappt hat.

auf alle fälle erst mal danke!!!

sven

von Sven F. (sven0876)


Lesenswert?

So nochmal eine kleine rückmeldung der i²c sniffer geht 1a und hat schon 
viel geholfen danke nochmal an euch für die nette und gute unterstützung 
nochmal passiert mir sowas nicht g
mfg sven

von Mario G. (maestro)


Lesenswert?

Hallo,

würde mit dem Sniffer auch gerne mal lauschen.

Habe aber leider nur folgende Quarze hier 4 MHz, 8 MHz, 16 MHz und einen 
ausgelöteten 14,318 MHz quarz hier.

Lässt sich da was machen ?

mit dem 14,318 bekomme ich zwar das Start, aber dann nur noch pppp und 
sssssss

gruß
Mario

von Hauke S. (hauke)


Lesenswert?

Hi Mario

Zuerst einmal wodrin läßt du den Mega8 laufen? evt. STK500?
Wenn ja dann kannst du den 3.68 MHz Software Takt (software-generated 
clock) vom STK500 nehmen. Die entsprechenden UART Parameter wären dann:
1
;RS232 init
2
  clr  work
3
  out  UBRRH,work
4
  ldi  work,0x01  ;für 115.2kBaud
5
;  ldi  work,0x02  ;für  76.8kBaud
6
;  ldi  work,0x03  ;für  57.6kBaud
7
;  ldi  work,0x05  ;für  38.4kBaud
8
  out  UBRRL,work
9
  ldi  work,(1<<TXC)
10
  out  UCSRA,work
11
  ldi  work,(1<<TXEN)
12
  out  UCSRB,work
13
  ldi  work,0x86
14
  out  UCSRC,work

Du brauchst aber nicht unbedingt ein STK500 oder einen Quarz.
Der Quarz ist sogar für das Sniffen relativ unerheblich.
Das Problem ist, daß pro übertragenem Byte auf dem I²C-Bus mehrere Byte 
über den UART gesendet werden müssen. Das bedeutet der Sniffer braucht 
eine hohe UART Geschwindigkeit. Und diese geht nur mit diesen 
"Ungeraden" Taktgeschwindigkeiten.
Ich habe zwar einen FIFO eingebaut, aber bei einem zu hohen 
Missverhältniss zwischen Eingabe und Ausgabe läuft jeder FIFO voll.

Es gibt jedoch einen Trick einem Mega8 mit dem internen Oscilator auf 
115kBaud zu bringen. Dazu stellt man den Oscilator auf 8MHz. Danach wird 
mithilfe des OCCAL-Registers der AVR auf 7,3728MHz untertaktet.

Am besten liest man das Oscillator Calibration Register aus, 
multipliziert diesen Wert mit 0,9216.
Das Ergebniss wird dann in den Code eingebracht.
Danach muß dann noch die UART Initialisierung so eingestellt werden als 
wenn man einen 7,3728MHz Quarz dranhängen hat.
1
;OSCCAL init
2
ldi   work,***     ;***=ist das oben angesprochene Ergebnis
3
out   OSCCAL,work
4
5
;RS232 init
6
  clr  work
7
  out  UBRRH,work
8
  ldi  work,0x03  ;für 115.2kBaud
9
;  ldi  work,0x05  ;für  76.8kBaud
10
;  ldi  work,0x07  ;für  57.6kBaud
11
;  ldi  work,0x11  ;für  38.4kBaud
12
  out  UBRRL,work
13
  ldi  work,(1<<TXC)
14
  out  UCSRA,work
15
  ldi  work,(1<<TXEN)
16
  out  UCSRB,work
17
  ldi  work,0x86
18
  out  UCSRC,work
Danach sollte es auch mit dem Calibrated Internal RC Oscillator gehen.
Eine Funktionsgarantie kann ich natürlich nicht geben. Also Anwendung 
auf eigende Gefahr.

Einen Max232 o.Ä. brauchst du aber so oder so für die RS232 Verbindung

Ich hoffe geholfen zu haben

cu
Hauke

von Mario G. (maestro)


Lesenswert?

Hallo Hauke,

vielen Dank für die Antwort,

ja ich lasse einen Mega32 im STK500 laufen.

Wie soll ich nun deinen Beispielcode einbauen, ich habe ja nur die HEX 
Datei von dir. Ich habe zwar die HEX Datei im AVR Studio geladen, aber 
das ist dann schon etwas gruslig alles zu analysieren.

Dann ist die Quarzfrequenz nur für RS232 relevant ? Das Start bekomme 
ich ja, aber wieso dann nur pppppppp und ssss.


viele Grüße
Mario

von Hauke S. (hauke)


Lesenswert?

Ähem Räusper

Der Code ist für einen Atmel ATMega8 geschrieben, und zwar in Assembler.
Das kann man nicht einfach in einen anderen, nicht pinkompatiblen, 
Controler packen.
Der Mega32 hat ganz andere Pins für die Interrupts usw.
Vermutlich gibt es auch eine Kollision zwischen dem FIFO und den 
IO-Registern.

Ich müßte erstmal schauen wie man den Code auf den Mega32 umpatchen 
müßte.


cu
Hauke

P.S.
Ich habe nur die Hexdatei raus gegeben, weil der Source Code ziemlich 
krude, unübersichtlich und undokumentiert war. Er war mir schlichtweg 
peinlich. Mittlerweile habe ich ihn aber etwas aufgeräumt.

Wenn die Leute vom mikrocontroller.net interressiert sind, dann kann man 
den Code vieleicht in einem Tutorial veröffentlichen.
Die sollen sich einfach bei Interresse melden

von Mario G. (maestro)


Lesenswert?

Hallo,

ja ok, bisher hat das immer ohne große probleme geklappt, ist aber der 
warscheinlichste Fehler.

Hab mir Heute den Mega 8 bestellt mit passenden quarzen.

Bitte Code Veröffentlichen :-) wäre Super.


viele Grüße
Mario

von Sven F. (sven0876)


Lesenswert?

hi fände es auch klasse wenn der code veröffentlicht würde! Deien arbeit 
ist echt spitze! und die einzige die ich bis jetzt gesehen hab die bis 
gut 200khz geht und noch bezahlbar für hobbyanwender ist!

sven

von Hauke S. (hauke)


Lesenswert?

Hi
Prinzipiel habe ich jetzt nichts mehr gegen eine Veröffentlichung.
Ich bin den Code nochmal durchgegangen, dokumentiert und einige Umwege 
beseitigt.
Er ist jetzt auch für AVRs mit größerem RAM einsetzbar (d.H. hat dann 
einen größerem FIFO)

Wogegen ich etwas habe ist, das sich irgend so ein Heini sich den Code 
runter lädt, in einen Chip brennt und diesen dann für teuer Geld an 
Noobs vertickt.

Sowas ist schonmal so bei C64 und Amiga Demos geschehen. Die Firma hat 
sich einfach den Code abgegriffen und dann für Geld angeboten. Ohne daß 
die eigendlichen Entwickler gennannt wurden, oder eine müde Mark 
bekommen hätten. Wenn man mit Copyrights nicht aufpasst dann könnten die 
dem Coder am Ende noch selbst die Verbreitung untersagen.

Ich hab halt keinen Bock das Leute mit meiner Arbeit Geld verdienen ohne 
selbst einen müden Handschlag dafür gemacht zu haben. (Ich habe aber 
nichts dagegen wenn mein Tool beim Debuggen eines Hobbyprojektes hilft 
welches hinterher plötzlich Geld abwirft.)

Ich kenne mich halt nicht so gut mit Copyright Bestimmungen aus, und 
wäre froh wenn die Leute von mikrocontroller.net das Projekt unter 
irgend eine GPL ähnliche Lizenz stellen könnten. Wäre nett wenn irgend 
jemand von euch einen der Admins kennen würde.

cu
Hauke

von Sven F. (sven0876)


Lesenswert?

Da hste recht kenn ich auch zu gut! im zenega forum haben wir die arbeit 
gemacht und irgendeiner vertickt die kostenlos verfügbaren artikel bei 
ebay für 9€. geb dir recht ist ärgerlich werd mal mit unserem 
forumsinhaber reden der solte in gpl und co sehr fit sein.

mlg sven

von ecslowhand (Gast)


Lesenswert?

Ich kann Hauke nur zu gut verstehen !

Du könntest höchstens ein paar Codeschnipsel der wichtigsten Routinen 
rausgeben. Ich denke darum geht es den meisten. Um ein lauffähiges 
Programm zu schreiben bedarf es halt dann doch noch ein bischen Arbeit 
(und Wissen).

Letztlich ist aber deine HEX-Datei völlig ausreichend. Lies doch noch 
einen DIP-Switch mit aus, um unterschiedliche Baudraten einzustellen, 
oder pack die  Werte ins EEROM. Diesen könnte man dann editieren.

Wie bereits gesagt: Ein schönes PROJEKT !!!!

LG EC

von Hauke S. (hauke)


Lesenswert?

Das mit dem EEPROM wäre schon eine gute Idee, nur habe ich noch nicht 
viel mit dem EEPROM gemacht.
Und zum zweiten ist das EEPROM empfindlich gegenüber solchen Tricks mit 
dem OSCCAL Register.

Ich muß mal schauen

cu
Hauke

von ecslowhand (Gast)


Lesenswert?

Wenn Du die Lösung mit dem EEPROM wählst, brauchst Du am OSCCAL-Register 
ja nicht mehr rumfummeln !

von Hauke S. (hauke)


Lesenswert?

Doch schon.
Es gibt immer noch solche Leute die weder einen Baudratenquarz noch 
STK500 übrig haben.
Und dann braucht man für die hohen Baudraten den Trick mit dem 
untertakteten, internem 8MHz Oszilator.
Dann braucht man außer einem Mega8, einem Max232 und ein wenig R und C 
Gestrüpp nicht für den Sniffer.

cu
Hauke

von Sven F. (sven0876)


Lesenswert?

slbst den max232 kann men meist weglasen da die meisten rs232 
schnittstellen zumintest auf der rx seite durchaus 0/5v Pegel 
kompatiebel sind. mein snffer ist nur noch ein atmega 2* 1MOhm 2*22pF un 
ddier 14,x quarz geht super.

eine idea hätte ich ncoh nachdem der atmega ja genug i/o eingänge noch 
frei hätte könnte man eine adress vorauswahl noch mit einbauen z.b. dip 
schalter oder auch eeprom

sven

von ecslowhand (Gast)


Lesenswert?

@ Sven F.: "slbst den max232 kann men meist weglasen"....
Mhhh..

Wenn schon, sollte man(n) das Ganze doch vernünftig machen. Ich 
"optimiere" doch auch nicht meine Abblockkondensatoren, Filter oder 
Sicherungen weg.....
Mir dieser Einstellung kannst Du auch Deine beiden 22pF-Kondensatoren 
streichen.

@Hauke: Nungut, aber wenn jemand schon einen Sniffer braucht, gehe ich 
davon aus, das er sich mit Elektronik beschäftigt. Und ein paar Quarze 
mit entsprechender Baudratenfrequenz in der Schublade sprengen 
sicherlich kein Budget, auch wenn`s noch so knapp ist.

Zum Thema OSCCAL-Register: Was nützt mir ein Sniffer an dem ich 
frequenzmässig rumbiegen muss, wenn ich mich doch halbwegs auf die 
"gesnifften" Daten verlassen will. Mit dem internen Oszillator ist das 
sowieso so eine Sache. Bei Anwendungen, wo das Timing nicht relevant ist 
kann man ihn gut benutzen. Aber Anwendngen mit RS232 fallen bei mir 
unter "Timingrelevant".

Lg EC

von Hauke S. (hauke)


Lesenswert?

@ecslowhand

Dem eingendlichen Sniffer ist es egal mit welcher Frequenz er läuft. 
(Hauptsache Sie ist um einen gewissen Faktor höher als die I²C 
Frequenz). Es ist nur die UART übertragung die gestört sein könnte.

Der Oszilator muß ja nur zu dem jeweiligem Zielcomputer passen. Es muß 
ja nicht universal sein. Sprich man kann bei Übertragungsfehlern noch 
trimmen. Ein zweites Stopbit hilft auch sehr gut.

Zum Thema Buget und Quarz in der Schublade: Das Design soll ja auch für 
die Anfänger da sein. Ihr wisst, die Leute die sich mit einem solchen 
Post melden:

"Mein I²C Programm funktioniert nicht"
(Post ende)

Die haben nicht immer eine Schublade voller Kleinkram.

Als ich die erste Version des Sniffers geprogt habe, ging es mir 
genauso. Ich hatte keinen Baudratequarz da. Und auch kein zweites 
STK500.

Ich werde aber mal mit einer EEPROM Version für Mega8, Mega16 und Mega 
32 probieren.

cu
Hauke

von ecslowhand (Gast)


Lesenswert?

@Hauke: "Das Design soll ja auch für
die Anfänger da sein."

Genau, deshalb weniger mit ISP-Einstellungen rumspielen (hier: OSCCAL) 
sondern eine Hardware die läuft (vorausgesetzt man kann löten ;) ).

Ein Anfänger hat kaum (keine) Möglichkeiten, eine nichtfunktionierende 
Hardware zum laufen zu bekommen.
Daher ist eine handvoll STANDARD-Bauteile der einfachste Weg.

Lg EC

von Philipp C. (ba4_philipp)


Lesenswert?

Finde deine Arbeit auch echt klasse Hauke. Vielen Dank nochmal dafür hat 
mir schon sehr viel geholfen.
Ich kann deine Bedenken auch voll nachvollziehen, du hast es mir ja 
damals einfach angepasst für meinen Quarz und seitdem bin ich super 
damit zufrieden. Ich denke den meisten würde es auch langen, wenn man 
einfach ein HEX File für ein paar gebräuchliche Quarze erstellt.
Was das Nachbauen betrifft, so hatte ich auch schon vor das ganze nicht 
nur auf meinem Steckbrett immer kurz aufzubauen, sondern eine kleine 
Platine zu ätzen und das so zu benutzen. (Mit HEX File wäre ein ebay 
oder sonstwas verkauft natürlich auch denkbar, vielleicht wäre es 
sinnvoll nicht nur Start sondern noch einen Text auszugeben mit deinem 
Namen oder so, um das zumindest ein wenig zu erschweren.)

Eine Sache gibt es allerdings noch. Deine Software scheint nur ein CR 
auszugeben und kein CR+LF. Ich muss es immer in meinem Terminal Programm 
umstellen, wenn ich die Nachrichten alle untereinander sehen möchte.

Gruß Philipp

von fabs (Gast)


Lesenswert?

schau mal
hier

http://creativecommons.org/license/

kannst du z.b. die passende creative-commons license raussuchen die zu 
deinen ansprüchen passt und unter der du deinen code verbreiten würdest.
auf der webseite gibts auch gute infos zur gpl oder lgpl.

gruß
fabian

von Hauke S. (hauke)


Lesenswert?

@Phillip

Für mein Terminal Programm hat einfach nur <CR> gereicht (Ich benutze 
Bray)
Der Stop Befehl ist eh der einzige Befehl welcher direkt mehr als 1 Byte 
über den UART senden muß. Könnte ich evt. erweitern. Muß mal schauen.

Zum Thema ätzen, Ich habe mir seit Ewigkeiten vorgeneommen eine USB 
Version mit FT245R Basis zu entwickeln. Dann kann man die Quarze ganz 
weglassen, hat einen höheren Durchsatz, und braucht keine RS232 
Schittstellen mehr.

cu
Hauke

P.S. mir ist grade noch eine Möglichkeit der "Veröffentlichung" 
eingefallen.

von Hauke S. (hauke)


Lesenswert?

So
Hier eine hab ihr eine Version wo ihr die UART einstellungen selbst 
vornehmen könnt.

cu
Hauke

1
; ******************************************************
2
; Sniffer.ASM
3
; ******************************************************
4
5
.include "C:\PROGRA~1\VMLAB\include\m8def.inc"
6
7
; variables
8
;
9
.def  work  =r16
10
11
; interrupt vectors
12
;
13
  rjmp  RESET             ; Reset Handler
14
  rjmp  EXT_INT0          ; IRQ0 Handler
15
  rjmp  EXT_INT1          ; IRQ1 Handler
16
  reti  ;TIM2_COMP        ; Timer2 Compare Handler
17
  reti  ;TIM2_OVF         ; Timer2 Overflow Handler
18
  reti  ;TIM1_CAPT        ; Timer1 Capture Handler
19
  reti  ;TIM1_COMPA       ; Timer1 CompareA Handler
20
  reti  ;TIM1_COMPB       ; Timer1 CompareB Handler
21
  reti  ;TIM1_OVF         ; Timer1 Overflow Handler
22
  reti  ;TIM0_OVF         ; Timer0 Overflow Handler
23
  reti  ;SPI_STC          ; SPI Transfer Complete Handler
24
  reti  ;USART_RXC        ; USART RX Complete Handler
25
  reti  ;USART_UDRE       ; UDR Empty Handler
26
  reti  ;USART_TXC        ; USART TX Complete Handler
27
  reti  ;ADC              ; ADC Conversion Complete Handler
28
  reti  ;EE_RDY           ; EEPROM Ready Handler
29
  rjmp  ANA_COMP          ; Analog Comparator Handler
30
  reti  ;TWSI             ; Two-wire Serial Interface Handler
31
  reti  ;SPM_RDY          ; Store Program Memory Ready Handler
32
33
.org 0x18
34
RESET:
35
.dw 0xE004,0xBF0E,0xE50F,0xBF0D,0x2400,0xE003,0x2E10,0xE004
36
.dw 0x2E20,0xE004,0x2E30,0xE008,0x2E40,0xE009,0x2E50,0xE200
37
.dw 0x2E60,0xE703,0x2E80,0xE700,0x2E90,0xE601,0x2EA0,0xE60E
38
.dw 0x2EB0,0xE00A,0x2E70,0xE0D1,0xE0C0,0xE0B1,0xE0A0,0xE090
39
.dw 0xE080,0x2711,0xE007,0xBF05,0xEC00,0xBF0B,0xE108,0x95A8
40
.dw 0xBD01,0xE100,0xBD01,0x940E,0x00D0,0xE004,0xBF00,0xE408
41
.dw 0xB908,0xE503,0x930D,0xE704,0x930D,0xE601,0x930D,0xE702
42
.dw 0x930D,0xE704,0x930D,0xE00D,0x930D,0x9606,0x9478,0x9B5D
43
.dw 0xCFFE,0x1180,0xC003,0x1190,0x1000,0xCFF9,0x9109,0x9701
44
.dw 0xB90C,0x11D2,0x1000,0xE0D1,0xCFF2
45
46
.org 0x68
47
ANA_COMP:
48
.dw 0x1191,0x1000,0x9518,0xE619,0x9B45,0x5210,0x931D,0x9601
49
.dw 0x11B2,0x1000,0xE0B1,0x9518
50
51
.org 0x78
52
EXT_INT0:
53
.dw 0x0F11,0x9983,0x9513,0x9523,0x1125,0x1000,0xC019,0x1123
54
.dw 0x1000,0xC002,0x1124,0x9518,0x1591,0xF428,0x301A,0xF040
55
.dw 0x5C19,0x931D,0x9601,0x2711,0x11B2,0x1000,0xE0B1,0x9518
56
.dw 0x5D10,0x931D,0x9601,0x2711,0x11B2,0x1000,0xE0B1,0x9518
57
.dw 0x1591,0xF428,0xFF10,0x92AD,0xFD10,0x92BD,0x9601,0x2722
58
.dw 0x2711,0x11B2,0x1000,0xE0B1,0x9518
59
60
.org 0xA8
61
EXT_INT1:
62
.dw 0x9B82,0x9518,0x9983,0xC00B,0x2722,0x2711,0x1191,0x1000
63
.dw 0x9518,0x928D,0x9601,0x11B2,0x1000,0xE0B1,0x9518,0x2722
64
.dw 0x2711,0x1191,0x1000,0x9518,0x929D,0x9601,0x11B2,0x1000
65
.dw 0xE0B1,0x1191,0x1000,0x9518,0x927D,0x9601,0x11B2,0x1000
66
.dw 0xE0B1,0x9518
67
68
.org 0xD0
69
;Trimmen des internen Oscillators
70
;  ldi  work,0x81
71
;  out  osccal,work
72
;RS232 init
73
  clr  work
74
  out  UBRRH,work
75
  ldi  work,7    ;diese Konstante muß für die jeweilige Taktrate auf die gewünschte Baudrate eingestellt werden
76
  out  UBRRL,work
77
  ldi  work,(0<<RXC)|(1<<TXC)|(0<<UDRE)|(0<<FE)|(0<<DOR)|(0<<PE)|(0<<U2X)|(0<<MPCM)
78
  out  UCSRA,work
79
  ldi  work,(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(0<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8)|(0<<TXB8)
80
  out  UCSRB,work
81
  ldi  work,(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL)
82
  out  UCSRC,work
83
reti

von Hauke S. (hauke)


Lesenswert?

Ich habe jetzt grad keine I²C Hardware hier, deshalb sagt bescheid ob es 
funktioniert.

cu
Hauke

P.S
Ich habe <CR> gegen <LF> ausgetauscht.

von ecslowhand (Gast)


Lesenswert?

Nette Lösung :)

Die INCLUDE-Zeile wird aber unter AVRStudio eine Fehlermeldung auslösen.
".include "C:\PROGRA~1\VMLAB\include\m8def.inc""

Einfach in ".include "m8def.inc" ändern.

Danke für den "Code" !

Lg EC

von Ralph W. (tiscali)


Lesenswert?

Hallo, super Programm,
aufgespielt ldi  work angepasst und hat auf anhieb funktioniert

von RePi! (Gast)


Lesenswert?

Hallo,

das ist ein sehr interessanter Beitrag. Werde mir ebenfalls einen I2C 
Monitor mal stricken.
Ist womöglich etwas viel verlangt aber wäre es möglich dieses Projekt 
ebenfalls für einen M168 zu kompilieren. Der ist ja soweit 
Pinkompatibel.
Habe ein kleines fertiges Modul von embedit mit MAX202 hier. Leider mit 
M168 drauf. Beim Takt bin ich recht flexibel.
Wäre super, wenn das klappt.

Gruß RePi

von Hauke Sattler (Gast)


Lesenswert?

Muss ich mal schauen.
Ich bin noch bis Mitte August im Ausland und habe meinen Elektronik 
Krempel nicht mit dabei.
Der M168 hat meines wissens die neue IO Register Anordnung.
Müsste mal schauen ob das passt.

Ich melde mich dann wieder.

cu Hauke

von Peter D. (peda)


Lesenswert?

RePi! schrieb:
> Ist womöglich etwas viel verlangt aber wäre es möglich dieses Projekt
> ebenfalls für einen M168 zu kompilieren. Der ist ja soweit
> Pinkompatibel.

Der ist ja so groß.
Mit nem ATtiny85 kriegst Du alles in den D-Sub9 Stecker mit rein.
Und dann sind auch 400kHz kein Problem.

Beitrag "I2C (TWI) Sniffer mit AVR"


Peter

von Hauke Sattler (Gast)


Lesenswert?

Hi Peter
Klar ist deine Version kleiner und schneller.
Als ich die erste Versuch von meinem Sniffer gecodet habe, gab es den 
AT90S4433 noch (für diesen war der Code erst gedacht).
Die ersten funktionsfähigen Codeversionen waren aber dann schon für den 
Mega8. Als ich den dann 2006 gepostet hatte war der Code aber schon 
"uralt"
Ich habe schon lange nichts mehr dran gemacht, weil ich irgendwann mit 
eine Version mit FTDI245R (o.ä.) stricken wollte. RS232 stirbt ja so 
langsam aber sicher aus.
Was die Datenausgabe angeht, hast du ja mein Format verwendet (oder 
hattest die gleiche Idee)
Was ich auf jeden Fall vermeiden wollte, war das der Sniffer irgendwie 
in den Bus eingreift. Weiterhin habe ich noch eine Erkennung für 
Interruptsignal eingebaut (für z.B. PCF8574 "IO" oder PCF85x3 "RTC")

Ich werde wenn ich wieder in Deutschland bin, mal meinen Sourecode 
reinstellen.
cu
bis dann

von Robert (Gast)


Lesenswert?

Hallo

Ich suche einen C-Code für ein I2C Monitor

Habe schon den Beitrag von Peter Dannegger durchgelesen, aber dort wird 
ein Tiny.. vewendet mit dem USI

Ich bräuchte das für einen AT90CAN128 mit Grafik Display.
(Also nix Ausgabe über RS232)

Möchte mit dem AVR eine gewisse I2C Sequenz einlesen und je nach Inhalt 
dann eine Aktion durchführen.
(Geschwindigkeit liegt nur bei ca. 50kHz)

Hat jemand vielleicht einen Link oder Idee ?
Im Programmieren bin ich nicht ganz so fit... ;-)

Würde mich auf eine Antwort freien..

l.G. Robert

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.