2014年5月29日 星期四

Pronomen 代詞

Personalpronomen(人稱代詞)


Frageponomen(疑問代詞)
warum,wohin,was,was für ein,wann,mit wem,wie,
wie viel,woher,womit,wer,welcher,wo


Reflexivpronomen(反身代詞)


Relativpronomen(關係代詞)


Beispiel:
Das ist der Freund, der sehr gut Klavier spielt.(N)
Das ist der Freund, den ich im Urlaub kennen gelernt habe.(A)
Das ist der Freund, dem ich schon viel von dir erzählt habe.(D)
Das ist der Freund, dessen Foto dir so gut gefallen hat.(G)
Der Pianist, von dem ich dir erzählt habe, heißt Antonio.( Verb Präp)
Das ist das Haus, in dem/wo Mozart geboren ist.(Lokal)
Das ist die Bestem, was du machen konntest.(Superlativ)
Es gibt vieles, wofür ich mich interessiere.
Es gibt hier niemand, auf den ich mich wirklich verlassen kann.
Endlich hat er mein Auto repariert, was ich mir seit langem gewünscht habe. ( Satz)
Endlich hat er mein Auto repariert, worauf ich schon lange gewartet habe.  ( Satz)

2014年5月25日 星期日

Adjektivdeklination

定冠詞字尾變化
Singular : der,dieser,jeder,jener,welcher,alle,mancher,derjenige,derselbe,folgender
Plural:diese,jene,alle,manche,solche,welche,derjenigen,derselben,beide,sämtliche,irgendwelche





不定冠詞字尾變化
Singular : ein,kein,mein,irgendein
Plural : meine,keine




無冠詞字尾變化
Singular:dessen,wessen,manch,solch,welch,allerlei,mancherlei,etwas,genug,mehr,viel,wenig,nichts
Plural: andere,einige,ein paar,mehrere,folgende,viele,wenige,zahlreiche,zahllose,etliche,dessen,wessen,manch,solch,welch,all,sämtliche,beide,manche



在這邊要注意welch,manch,solch 可當bestimmt與unbestimmt Artikel
例如:
(ein) welch gutes Buch               -      welch gute Bücher 
(das) welches gute Buch            -       welche guten  Bücher       


總結

Genitiv的無冠詞想成名詞字尾已經有加上es,所以不用在另外加上es,形容詞字尾保持en
---------------------------------------------------------
Genitivbildung
Singular : die Tasche der jungen Frau
                 die Tasche einer jungen Frau
Plural     : die Taschen der jungen Frauen
                 (die) Taschen junger Frauen
oder          (die) Taschen von jungen Frauen
若是形容詞當名詞使用
Singular : der Brief des Überlebenden
                 der Brief eines Überlebenden
Plural     : die Briefe der Überlebenden
                 die Briefe Überlebender
                 die Briefe von Überlebenden
---------------------------------------------------------
例外:
dunkel -> ein dunkles Zimmer
hoch    -> ein hoher Turm
teuer    -> eine teure Wohnung
---------------------------------------------------------
eine super Idee
ein prima Vorschlag
-> immer ohne Endung.
---------------------------------------------------------
如果行容詞當副詞(adverb)使用,則不用字尾變化
Wir arbeiten fleißig -> adj ohne Endung.

Die Patientin ist schwer gestürzt und hat sich verletzt.
Sie hat sich noch nicht von ihrem schweren Sturz erholt.
---------------------------------------------------------
分詞當形容詞使用
schreiende Kinder -> Part.Präsens
genervte Mütter-> Part. Perfekt
----------------------------------------------------------
形容詞當名詞使用
(et)was Gesundes
viel/wenig/nichts Süßes
das/alles Wichtige
der/die/das Beste

alle為bestimmte Artikel,而einige,viele,einpaar,與數字為unbestimmte Artikel
ein Überlebender/ eine Überlebende
der Überlebende
viele Überlebende
alle Überlebenden

ein Deutscher
der Deutsche
100 Deutsche
alle Deutschen
---------------------------------------------------------
形容詞比較級字尾變化 am+en, der/die/das+e
Sie ist am schönsten.
           das schönste Mädchen.

2014年5月19日 星期一

py2exe在win32的bug

在桌機上win64產生的exe檔移到win32的筆電不相容
必須要筆電上另外install python26,wxpython,pyserial,py2exe

其中我用python IDLE按F5來執行的時候發生了以下不知道是怎麼回事的錯誤訊息
明明CODE都沒改過阿 = =

IDLE 2.6    
>>> =========== RESTART ==========
>>>
Traceback (most recent call last):
  File "C:\Python26\wxTerminal.py", line 332, in 
    app = MyApp(0)
  File "C:\Python26\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8631, in __init__
    self._BootstrapApp()
  File "C:\Python26\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8196, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "C:\Python26\wxTerminal.py", line 323, in OnInit
    wx.InitAllImageHandlers()
  File "C:\Python26\lib\site-packages\wx-3.0-msw\wx\_core.py", line 99, in deprecated_func
    wxPyDeprecationWarning, stacklevel=2)
  File "C:\Python26\lib\warnings.py", line 29, in _show_warning
    file.write(formatwarning(message, category, filename, lineno, line))
TypeError: idle_formatwarning_subproc() takes exactly 4 arguments (5 given)
>>>

後來google了一下,用cmd進入python26的資料夾,在執行python xxxxxx.py就可以執行了
有可能是因為少設了環境變數?

anyway 還是可以用py2exex來產生給win32 的 exe檔


2014年5月18日 星期日

Verben mit Präposition

A
aufhören mit 
Womit willst du aufhören? Mit dem Rauchen.
angst vor 
Wovor hast du oft Angst? Vor dem Krieg.
antworten auf
Worauf will der Lehrer nicht antworten? Auf diese Frage.
aufpassen auf
Worauf musst du bei Tanzen aufpassen? Auf den Rhythmus.
sich ärger über
Ich ärgere mich über die laut Musik meines Nachbar. 
achten auf 
Achten Sie bitte auf die Stufe.
anfangen mit 
Womit fängst du an?
Ich fange damit an, dass ich den Text lese.
abhängig von 
Das ist ganz verschieden und hängt von jedem Einzelnen ab.
sich aufregen über 
Sie hat sich sehr über diese schlechten Nachrichten aufgeregt.

B
beginnen mit 
Womit beginnt dein Tag? Mit einer Tasse Kaffee.
beschweren bei jmd über etwas
Worüber beschweren sich die Deutschen?
Sie beschweren sich darüber, dass sie zu viel arbeiten müssen.
bitten um
Sie können mich jederzeit um Hilfe bitten.
bewerben um
Ich möchte mich um einen guten Ausbildungsplatz bewerben.
sich beschäftigen mit 
Er beschäftigt sich sehr viel mit seinen Kindern.
aus etwas bestehen 構成
Woraus besteht deiner Meinung nach ein glückliches Leben?
sich bemühen um etwas 
Er bemüht sich um einen Studienplatz in den USA.
sich über etwas aufregen
Nicht über Misserfolge aufregen.
sich bedanken bei jmd für etwas (jmd danken für etwas)
Hast du dich schon bei Oma für das Geschenk bedankt ?
berichten über 
Um 17 Uhr berichten Wir wieder über das Fußball Spiel
sich auf etwas beziehen 提到,有關
Ich beziehe mich auf unser Telefongespräch von 12.04.
bekannt sein für etwas 
Er ist bekannt für seine guten Leistungen.
bekannt durch etwas 
Prof.Rau wurde durch seine neuartige Krebstherapie weltweit bekannt.
D
diskutieren mit jmd über etwas
In meiner Firma diskutieren Wir viel über Politik.
denken an
Ich denke an den Urlaub
danken für 
Ich danke Sie für die schönen Blumen.

E
erinnern anWoran kannst du dich nicht erinnern? An meinen ersten Schultag.
einladen zu
Wozu hat du Erika eingeladen? Zu meinem Geburtstag.
entschuldigen bei jmd für etwas
Sie reden zu viel und entschuldigen sich selten für ihre Fehler.
sich engagieren für/gegen 忙於
Er engagiert sich für/gegen den Weltfrieden.
sich entscheiden für 
Ich habe mich für diese Pullover entschieden.
sich für etwas einsetzen 主張,盡力
Ich möchte mich bewusst für Mehrsprachigkeit in der Schule hier in Deutschland einsetzen.
sich erholen von
Ich habe mich noch nicht von dieser Krankheit erholt.
erkennen an 
Ich habe dich an der Stimme erkannt.
sich erkundigen bei jmd nach etwas 詢問
Sie hat sich beim Passanten nach dem Weg erkundigt.
erzählen von
Erzählen Sie mir ein bisschen von Ihrer Reise.

F
freuen über (Vergangenheit)
Worüber hast du dich gestern gefreut? Über dein Geschenk.
freuen auf(Zukunft)
Ich freue mich auf meinen Urlaub nächste Woche.
sich fürchten vor
Wovor fürchtest du dich am meinsten?
fragen nach
Fragen Sie doch den Polizisten dort nach dem Weg.

G
glauben an
Woran glaubst du? Ich glaube an Gott.
sich gewöhnen an
Er kann sich an das deutsche Essen nicht gewöhnen.
Gedanken über
 Die Politiker müssten sich Gedanken über Umweltprobleme machen.
gehören zu
Dies gehören nicht zu meinen Aufgaben.

H
hoffen auf Worauf hoffen alle Menschen? Auf eine schöne Zukunft.
halten von
Allerdings halte ich nicht viel von der modernen Kunst.
halten für ...視為
Ich halte ihn für einen guten Menschen.

I
informieren über
Worüber informieren die Zeitungen? Über die Politiker
sich interessieren für
Ich interessiere mich sehr für Philosophie.

K
kümmern um
Worum muss sich jeder Chef kümmern? Um das gute Arbeitsklima.
klagen über
Er klagt oft über Kopfschmerzen.
Kontakt mit
Ich habe keinen Kontakt mehr mit den alten Freunden.
sich konzentrieren auf
Im Moment konzentriere ich mich auf das Studium.

L
lachen/reden über
Worüber lachst du? Über einen Witz.
leiden an(selbst Probleme oder Krankheit)
Er leidet an Bluthochdruck.
leiden unter(von draußen)
Ich leide sehr unter dem Lärm der Baustelle nebenan.
sich etwas Wert legen 
Ich lege mehr Wert auf das Wörterlernen.

N
über etwas nachdenken
Beim Reden nicht über jedes Wort nachdenken.
nachdenken über 
Ich werde über Ihren Vorschlag nachdenken.

P
protestieren gegen
Wir protestieren gegen den Bau neuer Atomkraftwerke.

R
reden über
Worüber redest du oft mit deinen Freunden? Über unsere Pläne. 
riechen nach
Sie riechen nach dem Frühling.
rechnen mit 
Mit Schwierigkeit muss man rechnen, wenn man gleichzeitig mit sehr ähnlichen Sprachen anfängt.

S
sprechen über
Wir wollte über das Lernen sprechen.
Sorgen um 
In erster Linie mache ich mir Sorgen um meine Kinder.
sich schützen vor/gegen etwas 
Mit dieser Creme schütze ich mich vor Sonnenbrand.Wie kann man sich gegen Grippe schützen?
schmecken nach
Die Suppe schmeckt nach nichts
schreiben an jmd über etwas 
Ich schreibe gerade einen Brief an meine Freundin.
sterben an 
Er ist an Krebs gestorben.
sich streiten um
Die Kinder streiten sich um die Spielsachen.

T
teilnehmen an
wie viel Leute haben an dem Kurs teilgenommen?
träumen von
Sie träumen von dem Glück ihrer Kinder.

V
sich vorbereiten auf 
Die Zeit, um mich auf den Wettbewerb vorzubereiten, ist mein knapp, weil ich noch zur Schule gehe.
sich verstehen/verabreden mit 
Es gibt viele, mit denen ich mich sehr gut verstehe und mit denen ich mich oft verabrede.
etwas verstehen von
Ich verstehe nichts von Autos.
auf etwas verzichten 放棄
Worauf kannst du im Leben auf keinen Fall verzichten?
sich auf etwas verlassen 相信
Ich verlasse mich beim Sprechen öfter auf meine Intuition.
sich verlieben in
Ich habe mich in ihn verliebt.

W
sich gegen etwas wehren 抵抗
Ich möchte gut informiert sein und mich gegen Missstände wehren können.
warten auf 
Ich warte auf die Strassebahn.
Wut auf 
Oft packt mich eine fürchterlich Wut auf Leute.
sich wundern über 
Ich wundere mich immer wieder über den technischen Fortschritt.
sich wenden an 求助
Wenden Sie sich doch bitte an die Dame  an der Rezeption.

Z
zweifel an
Sie hat mich immer unterstüzt und nie an meinem Talent gezweifelt.

Ü
jmd zu etwas überreden
Mein Freund hat mich zu diesem Ausflug überredet
jmd überzeugen von
Du musst dich den Personalchef von deinen Fähigkeiten überzeugen.





2014年5月17日 星期六

Der bestimmte/unbestimmte Artikel oder Nullartikel

Der bestimmte Artikel(der,die,das)

  • etwas schon mal erwähnt  之前已經提過
  • etwas schon bekannt  已經很有名的
  • die Leute wissen,wer oder was genau gemeint ist. 人們知道你在說誰
  • etwas nur einmal existiert  獨一無二的東西

        Namen von Gebirgen, Bergen, Meeren, Seen, Flüssen, Gestirnen    
        die Alpen, der Elbrus, die Wolga, der Bodensee, die Venus, die Erde...
        wenig Länder
        der Iran, die Schweiz, die Türkei, die USA,die Slowakei, der Libanon, der               Sudan
        einige Gebiete
        der Balkan, der Bosporus, die Normandie, die Bretagne, der Kaukasus
        beim Superlativ 
        das größte Haus, der reichste Mann
  • man generalisieren will  在一個群組中的ㄧ個例子
          Der Menschen ist ein Säugetier(哺乳動物)


Der unbestimmte Artikel

eine neue Information, etwas bisher unbekannt, nicht genau identifiziert
沒有明確的指出對象


Kein Artikel ( Nullartikel)

  • Eigennamen : Peter liebt Maria
  • Anreden und Titeln : Frau Dr. Müller, Professor Wassermann
  • Berufen  :  Ich bin Lehrer
  • Nationalität  : Ich bin Deutscher
  • Namen der meinsten Länder, Kontinente und Städte  :  in Europa, aus Wien, nach Deutschland 
  • unbestimmte Mengen : Wir brauchen noch Kuchen.
  • Nomen nach Maß-,Gewichts- und Mengenangaben : eine Tasse Tee, drei Kilo Zucker.
  • Materialien und Stoffen : Die Lampe ist aus Metall.
  • Zeitangaben ohne Präposition : Er kommt nächsten Freitag.
  • Abstrakta : Mann braucht viel Geduld für dies Arbeit.
  • generellen Begriffen(oft nach mit oder ohne) : mit Leichtigkeit, ohne Mühe.
  • festen Ausdrücken : nach Hause, Auto fahren, Klavier spielen
  • Unterrichts und Studienfächern :  Heute morgen habe ich Deutsch und Mathe.
  • Namen von Festen : Ostern,Pfingsten,Weihnachten
  • Plural des unbestimmten Artikels : ein alter Mann->alte Männer




Sich diskriminiert fühlen

Benachteiligung aus rassistischen Gründen oder wegen ethnischen Herkunft, des Geschlechts, der Religion, der Weltanschauung, einer Behinderung, des Alters oder der sexuellen Identität sind unzuverlässig.(Allgemeines Gleichbehandlungsgesetz)



anstarren
verlezten
mobben
drohen
kritisieren
auslachen
beleidigen
beschimpfen
nicht reinlassen
anschreien
ignorieren
ablehnen
belästigen
verprügeln
schlagen
unter Druck setzen
nerven









beleidigen   侮辱,故意用苛薄的字眼使人受傷
belästigen   騷擾, 故意對別人做他們不喜歡的事情
verprügeln  毒打,揍

2014年5月16日 星期五

Pyserial Wxpython with microblaze

target ML605,Python 2.6

在上篇建立好microblaze以address 0x7c600000 來控制LED燈
並在SDK裡面用UART來收集連續的address與data資料
所以可以用pyserial來代替tera term,並用wxGlade來建立一個超簡單的GUI好讓使用者使用

有關pyserial的wxpython範例可以在這邊看到
http://pyserial.sourceforge.net/examples.html#wxpython-examples
我會用到wxTerminal.py與wxSerialConfigDialog.py

主程式是wxTerminal, 它其實就是一個python 版的tera term

我先用wxGlade畫一個簡單的GUI,只有一個text與button
text用來寫address的data,button按下時直接送入address 0x7c600000與使用者寫入的資料
在這個例子寫入資料0x00000001 讓LED燈開始閃爍,0x00000000則讓它停止閃爍

打開wxGlade新增一個Frame,選wxFrame



加入一個boxsizer,點了boxsizer之後再點Frame的地方就會出現對話方塊,slots改成2,讓它把畫面分成兩半,使用者就可以輸入不同的功能方塊



在左邊的boxsizer加入一個textctrl 


把名子改成value,之後如果要做比較大的GUI,最好把名子改成跟所需的功能相關,這樣程式寫起來比較省力,知道自己在寫哪一塊,改完後在右邊的boxsizer再加入一個button,同樣把name改成Set


如果要改在gui上顯現的button名子要改widget裡面的label,我將它也設成Set


之後按application 可以看到產生程式的對話視窗,python與選擇輸出位置與檔案名稱,generate code



產生code以後,必須要用bind函式把setvalue定義它們的型態與自身的函式
在寫它們本身的函式,這邊在EvtSet中蒐集由EvtVal中輸入的資料並轉成hex,
EvtVal則是當使用者輸入超過8 個數字則出件警告訊息

在把pyserial整合進來,把需要的函式放進來

import 需要的module
import wxSerialConfigDialog
import serial
import threading
from time import sleep

完整的test.py為

#!/usr/bin/env python
# -*- coding: CP1252 -*-
#
# generated by wxGlade 0.6.8 (standalone edition) on Thu May 15 15:13:20 2014
#

import wx
import wxSerialConfigDialog
import serial
import threading
from time import sleep
# begin wxGlade: dependencies
import gettext
# end wxGlade

# begin wxGlade: extracode
# end wxGlade
#----------------------------------------------------------------------
SERIALRX = wx.NewEventType()
# bind to serial data receive events
EVT_SERIALRX = wx.PyEventBinder(SERIALRX, 0)

class SerialRxEvent(wx.PyCommandEvent):
    eventType = SERIALRX
    def __init__(self, windowID, data):
        wx.PyCommandEvent.__init__(self, self.eventType, windowID)
        self.data = data

    def Clone(self):
        self.__class__(self.GetId(), self.data)
#----------------------------------------------------------------------
LED_ADDR          = '7c600000'        
NEWLINE_CR      = 0
NEWLINE_LF      = 1
NEWLINE_CRLF    = 2        
        
LED  = int(0x00000000)
#----------------------------------------------------------------------
class TerminalSetup:
    """Placeholder for various terminal settings. Used to pass the
       options to the TerminalSettingsDialog."""
    def __init__(self):
        self.echo = False
        self.unprintable = False
        self.newline = NEWLINE_CRLF

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        self.serial = serial.Serial()
        self.serial.timeout = 0.5
        self.settings = TerminalSetup()
        self.thread = None
        self.alive = threading.Event()
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.Value = wx.TextCtrl(self, wx.ID_ANY, "")
        self.Set = wx.Button(self, wx.ID_ANY, _("Set"))

        self.__set_properties()
        self.__do_layout()
        # end wxGlade
        
        #-------------------------------------------------
        self.OnPortSettings(None)
        if not self.alive.isSet():
            self.Close()
        self.Bind(wx.EVT_BUTTON, self.EvtSet, self.Set)
        self.Bind(wx.EVT_TEXT,self.EVTVal,self.Value)
        
        # function 
    def Write(self, addr, data):
        writein = str(data)        
        if len(writein) == 3:
            data7 = writein[2]
            data6 = '0'
            data5 = '0'
            data4 = '0'
            data3 = '0'
            data2 = '0'
            data1 = '0'
            data0 = '0'
        elif len(writein) == 4:
            data7 = writein[3]
            data6 = writein[2]
            data5 = '0'
            data4 = '0'
            data3 = '0'
            data2 = '0'
            data1 = '0'
            data0 = '0'
        elif len(writein) == 5:
            data7 = writein[4]
            data6 = writein[3]
            data5 = writein[2]
            data4 = '0'
            data3 = '0'
            data2 = '0'
            data1 = '0'
            data0 = '0'
        elif len(writein) == 6:
            data7 = writein[5]
            data6 = writein[4]
            data5 = writein[3]
            data4 = writein[2]
            data3 = '0'
            data2 = '0'
            data1 = '0'
            data0 = '0'
        elif len(writein) == 7:
            data7 = writein[6]
            data6 = writein[5]
            data5 = writein[4]
            data4 = writein[3]
            data3 = writein[2]
            data2 = '0'
            data1 = '0'
            data0 = '0'
        elif len(writein) == 8:
            data7 = writein[7]
            data6 = writein[6]
            data5 = writein[5]
            data4 = writein[4]
            data3 = writein[3]
            data2 = writein[2]
            data1 = '0'
            data0 = '0'
        elif len(writein) == 9:
            data7 = writein[8]
            data6 = writein[7]
            data5 = writein[6]
            data4 = writein[5]
            data3 = writein[4]
            data2 = writein[3]
            data1 = writein[2]
            data0 = '0'
        elif len(writein) == 10:
            data7 = writein[9]
            data6 = writein[8]
            data5 = writein[7]
            data4 = writein[6]
            data3 = writein[5]
            data2 = writein[4]
            data1 = writein[3]
            data0 = writein[2]
        else:
            data7 = writein[9]
            data6 = writein[8]
            data5 = writein[7]
            data4 = writein[6]
            data3 = writein[5]
            data2 = writein[4]
            data1 = writein[3]
            data0 = writein[2]
        
         
        self.serial.write(addr)
        self.serial.write(data0)
        self.serial.write(data1)
        self.serial.write(data2)
        self.serial.write(data3)
        self.serial.write(data4)
        self.serial.write(data5)
        self.serial.write(data6)
        self.serial.write(data7)

    def EvtSet(self,event):        
        GetValue = hex(int(self.Value.GetValue(),16))        
        self.Write(LED_ADDR,GetValue)
        #self.Write('7c600000','00000000')
        
    def EVTVal(self,event):
        length = len(event.GetString())
        if length > 8:
            alert_dialog = wx.MessageDialog(None,u"Bits Overflow",u"Error",wx.OK             | wx.ICON_ERROR)
            if alert_dialog.ShowModal() == wx.ID_OK:
                alert_dialog.Destroy()
        

    def StartThread(self):
        """Start the receiver thread"""        
        self.thread = threading.Thread(target=self.ComPortThread)
        self.thread.setDaemon(1)
        self.alive.set()
        self.thread.start()

    def StopThread(self):
        """Stop the receiver thread, wait util it's finished."""
        if self.thread is not None:
            self.alive.clear()          #clear alive event for thread
            self.thread.join()          #wait until thread has finished
            self.thread = None

    def OnTermSettings(self, event):
        """Menu point Terminal Settings. Show the settings dialog
           with the current terminal settings"""
        dialog = TerminalSettingsDialog(None, -1, "", settings=self.settings)
        result = dialog.ShowModal()
        dialog.Destroy()
        
    def OnPortSettings(self, event=None):
        """Show the portsettings dialog. The reader thread is stopped for the
           settings change."""
        if event is not None:           #will be none when called on startup
            self.StopThread()
            self.serial.close()
        ok = False
        while not ok:
            dialog_serial_cfg = wxSerialConfigDialog.SerialConfigDialog(None, -1,            "",
            show=wxSerialConfigDialog.SHOW_BAUDRATE|wxSerialConfigDialog.SHOW_FOR             MAT|wxSerialConfigDialog.SHOW_FLOW,
                serial=self.serial
            )
            result = dialog_serial_cfg.ShowModal()
            dialog_serial_cfg.Destroy()
            #open port if not called on startup, open it on startup and OK too
            if result == wx.ID_OK or event is not None:
                try:
                    self.serial.open()
                except serial.SerialException, e:
                    dlg = wx.MessageDialog(None, str(e), "Serial Port Error", wx.                     OK | wx.ICON_ERROR)
                    dlg.ShowModal()
                    dlg.Destroy()
                else:
                    self.StartThread()
                    self.SetTitle("Serial Terminal on %s [%s, %s%s%s%s%s]" % (
                        self.serial.portstr,
                        self.serial.baudrate,
                        self.serial.bytesize,
                        self.serial.parity,
                        self.serial.stopbits,
                        self.serial.rtscts and ' RTS/CTS' or '',
                        self.serial.xonxoff and ' Xon/Xoff' or '',
                        )
                    )
                    ok = True
            else:
                #on startup, dialog aborted
                self.alive.clear()
                ok = True
           
    def OnKey(self, event):
        """Key event handler. if the key is in the ASCII range, write it to the s           erial port.
           Newline handling and local echo is also done here."""
        code = event.GetKeyCode()
        if code < 256:                          #is it printable?
            if code == 13:                      #is it a newline? (check for CR w                                                 hich is the RETURN key)
                if self.settings.echo:          #do echo if needed
                    self.COM_STATUS.AppendText('\n')
                if self.settings.newline == NEWLINE_CR:
                    self.serial.write('\r')     #send CR
                elif self.settings.newline == NEWLINE_LF:
                    self.serial.write('\n')     #send LF
                elif self.settings.newline == NEWLINE_CRLF:
                    self.serial.write('\r\n')   #send CR+LF
            else:
                char = chr(code)
                if self.settings.echo:          #do echo if needed
                    self.COM_STATUS.WriteText(char)
                self.serial.write(char)         #send the charcater
        else:
            print "Extra Key:", code

    def OnSerialRead(self, event):
        """Handle input from the serial port."""
        text = event.data
        if self.settings.unprintable:
            text = ''.join([(c >= ' ') and c or '<%d>' % ord(c)  for c in text])
        self.COM_STATUS.AppendText(text)
        
    def ComPortThread(self):
        """Thread that handles the incomming traffic. Does the basic input
           transformation (newlines) and generates an SerialRxEvent"""
        while self.alive.isSet():               #loop while alive event is true
            text = self.serial.read(1)          #read one, with timout
            if text:                            #check if not timeout
                n = self.serial.inWaiting()     #look if there is more to read
                if n:
                    text = text + self.serial.read(n) #get it
                #newline transformation
                if self.settings.newline == NEWLINE_CR:
                    text = text.replace('\r', '\n')
                elif self.settings.newline == NEWLINE_LF:
                    pass
                elif self.settings.newline == NEWLINE_CRLF:
                    text = text.replace('\r\n', '\n')
                event = SerialRxEvent(self.GetId(), text)
                self.GetEventHandler().AddPendingEvent(event)
                #~ self.OnSerialRead(text)         #output text in window               
 #----------------------------------------------------------------------
    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle(_("Test"))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.Value, 0, 0, 0)
        sizer_2.Add(self.Set, 0, 0, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade

# end of class MyFrame
if __name__ == "__main__":
    gettext.install("app") # replace with the appropriate catalog name
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()
紅色的程式是從wxTerminal.py整合過來,綠色的是自己加上去的
函式write是為了如果使用者沒有完整輸入8位數,則自動補零
所以在測試的時候,即使對話框只輸入1,LED燈也是會閃爍
程式測試成功以後,把它轉成exe
寫一個py2exesetup.py,windows=['test.py'] 裡填入要轉換的py
from distutils.core import setup   
import py2exe  
setup(  
      windows=['test.py'],   
      options = {           
      "py2exe":  
       {"dll_excludes":["MSVCP90.dll"]}  
       }  
) 
把所有會引用到的py檔與py2exesetup.py複製到c下面的python26
然後打開cmd進入python26command
python py2exesetup.py install 
python py2exesetup.py py2exe
就會在同一層的資料夾中產生一個新的disk資料夾
裡面的exe檔就是轉換出來的小寶貝拉XD

Ml605 microblaze with your own IP

Ml605 microblaze with your own IP

無可避免的還是用microblaze比較威,先來建立一個自己的IP放在AXI,方便接來下用UART進來的資料可以一起經由bus進入IP內部的邏輯

前兩年做過的東西早就忘光了,今天又依照tutorial 做了一次,趕快來紀錄一下,這樣下次複習比較快XDDDD

Tutorial 原版 EDK Concepts, Tools, and Techniques
A Hands-On Guide to EffectiveEmbedded System Design
UG683 (v13.4) January 18, 2012

建立一個專案,新增processer
選擇讓processor先預選基本的配備,然後在刪掉不需要的
local memory size 調大一點
timer新增進來,並加上interrupt

LED之後要做測試用所以不加進來


完成了以後可以看到大致的結構


接下來新增一個自己的IP


依照tutorial 新增一個blink ip,然後一直按到finish


打開\system\pcores\blink_v1_00_a\hdl\vhdl
裡面的兩個vhdl檔來新增port與寫入功能

blink.vhdl


user_logic.vhdl,利用輸入addressdata來決定讓led閃爍或是停止


在打開\system\pcores\blink_v1_00_a\data 裡面的 blink_v2_1_0.mpd
LEDs加入port


改完了以後按


就會在左側的ip列表裡面看到剛剛的blink,按兩下加入bus


base_address 先不用改,稍後系統會自動分配


portleds拉到外面的pin


addresses可以看到我們新增的ipaddress0x7c600000


接下來按hardware- generate netlist

成功了以後來寫top levelucf,注意blink_0_LEDs_pin 是否出現在output pin

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity ml605_microblaze_top is
    Port (
    osc_200m_p : in  STD_LOGIC;
    osc_200m_n : in  STD_LOGIC;
    reset : in  STD_LOGIC;
    uart_tx : out  STD_LOGIC;
    uart_rx : in  STD_LOGIC;
    gpio_led : out  STD_LOGIC_VECTOR (3 downto 0);
    gpio_dip : in  STD_LOGIC_VECTOR (7 downto 0));
end ml605_microblaze_top;

architecture Behavioral of ml605_microblaze_top is

  component system is
    port (
      RS232_Uart_1_sout : out std_logic;
      RS232_Uart_1_sin : in std_logic;
      RESET : in std_logic;
      blink_0_LEDs_pin : out std_logic_vector(3 downto 0);
      DIP_Switches_8Bits_TRI_I : in std_logic_vector(7 downto 0);
      CLK_P : in std_logic;
      CLK_N : in std_logic
    );
  end component;

begin

  microblaze_i : system
    port map (
      RS232_Uart_1_sout => uart_tx,
      RS232_Uart_1_sin => uart_rx,
      RESET => reset,
      blink_0_LEDs_pin => gpio_led,
      DIP_Switches_8Bits_TRI_I => gpio_dip,
      CLK_P => osc_200m_p,
      CLK_N => osc_200m_n
    );
end Behavioral;

NET osc_200m_n LOC = "H9" | DIFF_TERM = "TRUE" | IOSTANDARD = "LVDS_25";
NET osc_200m_p LOC = "J9" | DIFF_TERM = "TRUE" | IOSTANDARD = "LVDS_25";
NET gpio_dip[0] LOC = "D22" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[1] LOC = "C22" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[2] LOC = "L21" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[3] LOC = "L20" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[4] LOC = "C18" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[5] LOC = "B18" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[6] LOC = "K22" | IOSTANDARD = "LVCMOS15";
NET gpio_dip[7] LOC = "K21" | IOSTANDARD = "LVCMOS15";
NET gpio_led[0] LOC = "AC22" | IOSTANDARD = "LVCMOS25";
NET gpio_led[1] LOC = "AC24" | IOSTANDARD = "LVCMOS25";
NET gpio_led[2] LOC = "AE22" | IOSTANDARD = "LVCMOS25";
NET gpio_led[3] LOC = "AE23" | IOSTANDARD = "LVCMOS25";

NET reset LOC = "H10" | IOSTANDARD = "SSTL15" | TIG;
NET uart_rx LOC = "J24" | IOSTANDARD = "LVCMOS25";
NET uart_tx LOC = "J25" | IOSTANDARD = "LVCMOS25";

接下來在ISE geberate programming file

新增一個workspace資料夾

之後在XPS上直接連到SDK,指向剛剛新增的workspace



可以看到SDK上已經有Processor的資料


file-new-application project
新增一個hello world project

然後programm FPGA  


接下來可以用兩種方法來玩一下UART
  1. hello world 不用改,XMD Console
XMD%
Accepted a new TCLSock connection from 127.0.0.1 on port 53775
Programming Bitstream -- D:/ml605_microblaze/workspace/system_hw_platform/download.bit
Fpga Programming Progress ......10....20....30....40....50....60....70....80....90.....Done
mb

JTAG chain configuration
--------------------------------------------------
Device ID Code IR Length Part Name
1 0a001093 8 System_ACE_CF
2 64250093 10 XC6VLX240T

MicroBlaze Processor Configuration :
-------------------------------------
Version............................8.40.b
Optimization.......................Performance
Interconnect.......................AXI-LE
MMU Type...........................No_MMU
No of PC Breakpoints...............1
No of Read Addr/Data Watchpoints...0
No of Write Addr/Data Watchpoints..0
Instruction Cache Support..........off
Data Cache Support.................off
Exceptions Support................off
FPU Support.......................off
Hard Divider Support...............off
Hard Multiplier Support............on - (Mul32)
Barrel Shifter Support.............on
MSR clr/set Instruction Support....on
Compare Instruction Support........on
Data Cache Write-back Support......off
Fault Tolerance Support............off
Stack Protection Support...........off

Connected to MicroBlaze "mdm" target. id = 0
Starting GDB server for "mdm" target (id = 0) at TCP port no 1234

Note:: "mbconnect" command is Deprecated. Use "connect mb" command
XMD% stop
Processor stopped

XMD% mwr 0x7c600000 0x1
XMD% mrd 0x7c600000
7C600000: 00000001

XMD% mwr 0x7c600000 0x0
XMD%

第二種方法新增peripheral_tests_0 application project , 讓我們用c來控制uart



可以看到在左欄已經產了一些與周邊相關的程式,但這不是全部我需要的XD
我需要可以一個可以從UART搜集資料進來變成hex,好讓我可以把資料送入microblazeaxi bus,進而控制自創IPLED



裡面的reference code中的xlib_string.hxil_string.c,人家寫好的函式總是比較好用阿XD \xapp493_DisplayPort_SPM\XAPP493\v6\ML605\sdk_workspace\dp_source_policy_maker_0\src
xlib_string.h
//#define SIMULATION
#define DEBUG_LEVEL 1


#include "xil_types.h"

#define PRINT_TS 0
#define PRINT_EDID 1
#define LLC_TEST_MODE 0

#if (DEBUG_LEVEL >= 4)
#define dbg4_printf xil_printf
#else
#define dbg4_printf do_nothing
#endif

#if (DEBUG_LEVEL >= 3)
#define dbg3_printf xil_printf
#else
#define dbg3_printf do_nothing
#endif

#if (DEBUG_LEVEL >= 2)
#define dbg2_printf xil_printf
#else
#define dbg2_printf do_nothing
#endif

#if (DEBUG_LEVEL >= 1)
#define dbg_printf xil_printf
#define dbg1_printf xil_printf
#else
#define dbg_printf do_nothing
#define dbg1_printf do_nothing
#endif

#if (DEBUG_LEVEL == 0)
#define dbg_printf do_nothing
#endif

#define dbg_llc_printf do_nothing //xil_printf
#define dbg1_llc_printf do_nothing //xil_printf
#define dbg2_llc_printf do_nothing

void do_nothing();

char xil_getc(u32 timeout_ms);

u32 xil_gethex(u8 num_chars);


xil_string.c
#include "xlib_string.h"
#include "stdio.h"
#include "xlib_string.h"
#include "xuartlite_l.h"
#include "xparameters.h"
#include "xtmrctr.h"

char xil_getc(u32 timeout_ms){
 char c;
 u32 timeout = 0;

   extern XTmrCtr TimerCounter;

   //dbg_printf ("timeout_ms = %x\n\r",timeout_ms);
     // Reset and start timer
   if ( timeout_ms > 0 && timeout_ms != 0xff ){
    XTmrCtr_Start(&TimerCounter, 0);
    //dbg_printf ("timeout_ms = %x\n\r",timeout_ms);
   }



  while(XUartLite_IsReceiveEmpty(STDIN_BASEADDRESS) && (timeout == 0)){
      if ( timeout_ms == 0 ){ // no timeout - wait for ever
      timeout = 0;
      } else if ( timeout_ms == 0xff ) { // no wait - special case
      timeout = 1;
      } else if(timeout_ms > 0){
    if(XTmrCtr_GetValue(&TimerCounter, 0) > ( timeout_ms * (XPAR_MICROBLAZE_CORE_CLOCK_FREQ_HZ / 1000) )){
     timeout = 1;
    }
      }
  }
  if(timeout == 1){
   c = 0;
  } else {
   c = XUartLite_RecvByte(STDIN_BASEADDRESS);
  }

  return c;
}


u32 xil_gethex(u8 num_chars){
u32 data;
u32 i;
u8 term_key;
data = 0;

for(i=0;i= 'a') {
  term_key = term_key - 'a' + 10;
 } else if(term_key >= 'A') {
   term_key = term_key - 'A' + 10;
 } else {
  term_key = term_key - '0';
 }
 data = (data << 4) + term_key;
}


return data;
}

void do_nothing(){

}



將這兩個檔案加入我們建立的peripheral project,因為要init platform, 所以也把hello_world_0 裡面的platform.c, platform.h, platform_config.h 加入 peripheral project

將原本的testperiph.c main()拿掉,加入剛剛的h file
#include 
#include "xparameters.h"
#include "xil_cache.h"
#include "xintc.h"
#include "intc_header.h"
#include "uartlite_header.h"
#include "xbasic_types.h"
#include "xgpio.h"
#include "gpio_header.h"
#include "xtmrctr.h"
#include "tmrctr_header.h"
#include "tmrctr_intr_header.h"

//------------------ ADD CODE ---------------------
#include "xlib_string.h"
#include "platform.h"

void reg_write(u32 reg_address, u32 data);
u32  reg_read(u32 reg_address);
XTmrCtr TimerCounter;

int main()
{
    init_platform();
    while(1){
     dbg_printf(" TEST ");
     u32 addr = xil_gethex(8);
     u32 data = xil_gethex(8);
     reg_write(addr,data);
    }//end while
    cleanup_platform();
    return 0;
}

void reg_write(u32 reg_address, u32 data)
{
 dbg_printf("reg_write (0x%08x) 0x%08x\n\r", reg_address, data);
    *(volatile u32*)reg_address = data;
}

u32 reg_read(u32 reg_address)
{
 dbg_printf("reg_read (0x%08x) ", reg_address);
 u32 data = *(volatile u32*)reg_address;
 dbg_printf(" 0x%08x\n\r", data);
    return data;
}


在將產生的elf檔燒入版子,打開tera term,連續寫入addressdata就可以看到板子上的LED已經開始閃耀搂!




要注意一下microblazebaudrateteraterm的是否一致

如果之後不會再改sdk或是下次懶得再開sdk的話也可以直接把download.bit 燒進去板子裡面, programm FPGA後的console下方寫著
data2mem -bm D:/ml605_microblaze/edkBmmFile_bd.bmm -bt \
D:/ml605_microblaze/ml605_microblaze_top.bit -bd \
D:/ml605_microblaze/workspace/peripheral_tests_0/Debug/peripheral_tests_0.elf tag \
microblaze_0 -o b D:/ml605_microblaze/workspace/system_hw_platform/download.bit

系統已經自動幫你下commandworkspace/system_hw_platform/download.bit

結論有錢的真的是大爺,系統都幫你做好了,如果用免錢的microblaze就是童養媳的命運阿阿阿阿!!!!

這篇寫得太囉嗦了,後記下一篇用wxpythonserial來寫一個簡單的小介面來跟板子溝通,並產生exe檔方便其他沒有灌python的人使用